Updates

Update 2021.08.11

Most thorough way to readdress differences between original and current analyses is to jsut redo the biomark. To that end, will restart analysis of just CMPm2, excluding other datasets (i.e., LSK, MEP, GMP). Will also keep

Notebook setup

Creating new pipeline using seurat v4.0.2 available 2021.06.08

Load libraries required for Seuratv4

library(dplyr)
library(Seurat)
library(patchwork)
library(ggplot2)
library(clustree)

Set global variables

projectName <- "CMP"
jackstraw.dim <- 40

store session info

sessionInfo.filename <- paste0(projectName, "_sessionInfo.txt")
sink(sessionInfo.filename)
sessionInfo()
sink()
source("../RFunctions/read_10XGenomics_data.R")
source("../RFunctions/PercentVariance.R")
source("../RFunctions/Mouse2Human_idconversion.R")
setwd("../../cellRanger/") # temporarily changing wd only works if you run the entire chunk at once
data_file.list <- read_10XGenomics_data(sample.list = "CMPm2")
object.data <-Read10X(data_file.list)
cmp.object<- CreateSeuratObject(counts = object.data, min.cells = 3, min.genes = 200, project = projectName)

Clean up to free memory

remove(object.data)

Add mitochondrial metadata and plot some basic features

cmp.object[["percent.mt"]] <- PercentageFeatureSet(cmp.object, pattern = "^mt-")
VlnPlot(cmp.object, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3, pt.size = 0, fill.by = 'orig.ident', )

plot1 <- FeatureScatter(cmp.object, feature1 = "nCount_RNA", feature2 = "percent.mt", group.by = "orig.ident", pt.size = 0.01)
plot2 <- FeatureScatter(cmp.object, feature1 = "nCount_RNA", feature2 = "nFeature_RNA", group.by = "orig.ident", pt.size = 0.01)
plot1 + plot2

Filter data

remove low quality cells require: nFeature_RNA between 200 and 4000 (inclusive) require: percent.mt <=5

print(paste("original object:", nrow(cmp.object@meta.data), "cells", sep = " "))
[1] "original object: 12540 cells"
cmp.object <- subset(cmp.object, 
                                                subset = nFeature_RNA >=200 & 
                                                    nFeature_RNA <= 4000 & 
                                                    percent.mt <= 5
                                                )
print(paste("new object:", nrow(cmp.object@meta.data), "cells", sep = " "))
[1] "new object: 12059 cells"
cmp.object <- NormalizeData(cmp.object, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

Find variable features

cmp.object <- FindVariableFeatures(cmp.object, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
top10 <- head(VariableFeatures(cmp.object), 10)
plot1 <- VariableFeaturePlot(cmp.object)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
When using repel, set xnudge and ynudge to 0 for optimal results
plot1 + plot2

Scale data (linear transformation)

We don’t have to worry about comparing library depths, so we’ll just do normalization/Scale data

Regressing out nFeature_RNA, nCount_RNA

  |                                                                                                                                                                                                                      
  |                                                                                                                                                                                                                |   0%
  |                                                                                                                                                                                                                      
  |=                                                                                                                                                                                                               |   0%
  |                                                                                                                                                                                                                      
  |=                                                                                                                                                                                                               |   1%
  |                                                                                                                                                                                                                      
  |==                                                                                                                                                                                                              |   1%
  |                                                                                                                                                                                                                      
  |===                                                                                                                                                                                                             |   1%
  |                                                                                                                                                                                                                      
  |===                                                                                                                                                                                                             |   2%
  |                                                                                                                                                                                                                      
  |====                                                                                                                                                                                                            |   2%
  |                                                                                                                                                                                                                      
  |=====                                                                                                                                                                                                           |   2%
  |                                                                                                                                                                                                                      
  |=====                                                                                                                                                                                                           |   3%
  |                                                                                                                                                                                                                      
  |======                                                                                                                                                                                                          |   3%
  |                                                                                                                                                                                                                      
  |=======                                                                                                                                                                                                         |   3%
  |                                                                                                                                                                                                                      
  |=======                                                                                                                                                                                                         |   4%
  |                                                                                                                                                                                                                      
  |========                                                                                                                                                                                                        |   4%
  |                                                                                                                                                                                                                      
  |=========                                                                                                                                                                                                       |   4%
  |                                                                                                                                                                                                                      
  |=========                                                                                                                                                                                                       |   5%
  |                                                                                                                                                                                                                      
  |==========                                                                                                                                                                                                      |   5%
  |                                                                                                                                                                                                                      
  |===========                                                                                                                                                                                                     |   5%
  |                                                                                                                                                                                                                      
  |===========                                                                                                                                                                                                     |   6%
  |                                                                                                                                                                                                                      
  |============                                                                                                                                                                                                    |   6%
  |                                                                                                                                                                                                                      
  |=============                                                                                                                                                                                                   |   6%
  |                                                                                                                                                                                                                      
  |==============                                                                                                                                                                                                  |   6%
  |                                                                                                                                                                                                                      
  |==============                                                                                                                                                                                                  |   7%
  |                                                                                                                                                                                                                      
  |===============                                                                                                                                                                                                 |   7%
  |                                                                                                                                                                                                                      
  |================                                                                                                                                                                                                |   7%
  |                                                                                                                                                                                                                      
  |================                                                                                                                                                                                                |   8%
  |                                                                                                                                                                                                                      
  |=================                                                                                                                                                                                               |   8%
  |                                                                                                                                                                                                                      
  |==================                                                                                                                                                                                              |   8%
  |                                                                                                                                                                                                                      
  |==================                                                                                                                                                                                              |   9%
  |                                                                                                                                                                                                                      
  |===================                                                                                                                                                                                             |   9%
  |                                                                                                                                                                                                                      
  |====================                                                                                                                                                                                            |   9%
  |                                                                                                                                                                                                                      
  |====================                                                                                                                                                                                            |  10%
  |                                                                                                                                                                                                                      
  |=====================                                                                                                                                                                                           |  10%
  |                                                                                                                                                                                                                      
  |======================                                                                                                                                                                                          |  10%
  |                                                                                                                                                                                                                      
  |======================                                                                                                                                                                                          |  11%
  |                                                                                                                                                                                                                      
  |=======================                                                                                                                                                                                         |  11%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  11%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  12%
  |                                                                                                                                                                                                                      
  |=========================                                                                                                                                                                                       |  12%
  |                                                                                                                                                                                                                      
  |==========================                                                                                                                                                                                      |  12%
  |                                                                                                                                                                                                                      
  |==========================                                                                                                                                                                                      |  13%
  |                                                                                                                                                                                                                      
  |===========================                                                                                                                                                                                     |  13%
  |                                                                                                                                                                                                                      
  |============================                                                                                                                                                                                    |  13%
  |                                                                                                                                                                                                                      
  |============================                                                                                                                                                                                    |  14%
  |                                                                                                                                                                                                                      
  |=============================                                                                                                                                                                                   |  14%
  |                                                                                                                                                                                                                      
  |==============================                                                                                                                                                                                  |  14%
  |                                                                                                                                                                                                                      
  |==============================                                                                                                                                                                                  |  15%
  |                                                                                                                                                                                                                      
  |===============================                                                                                                                                                                                 |  15%
  |                                                                                                                                                                                                                      
  |================================                                                                                                                                                                                |  15%
  |                                                                                                                                                                                                                      
  |================================                                                                                                                                                                                |  16%
  |                                                                                                                                                                                                                      
  |=================================                                                                                                                                                                               |  16%
  |                                                                                                                                                                                                                      
  |==================================                                                                                                                                                                              |  16%
  |                                                                                                                                                                                                                      
  |==================================                                                                                                                                                                              |  17%
  |                                                                                                                                                                                                                      
  |===================================                                                                                                                                                                             |  17%
  |                                                                                                                                                                                                                      
  |====================================                                                                                                                                                                            |  17%
  |                                                                                                                                                                                                                      
  |====================================                                                                                                                                                                            |  18%
  |                                                                                                                                                                                                                      
  |=====================================                                                                                                                                                                           |  18%
  |                                                                                                                                                                                                                      
  |======================================                                                                                                                                                                          |  18%
  |                                                                                                                                                                                                                      
  |======================================                                                                                                                                                                          |  19%
  |                                                                                                                                                                                                                      
  |=======================================                                                                                                                                                                         |  19%
  |                                                                                                                                                                                                                      
  |========================================                                                                                                                                                                        |  19%
  |                                                                                                                                                                                                                      
  |=========================================                                                                                                                                                                       |  19%
  |                                                                                                                                                                                                                      
  |=========================================                                                                                                                                                                       |  20%
  |                                                                                                                                                                                                                      
  |==========================================                                                                                                                                                                      |  20%
  |                                                                                                                                                                                                                      
  |===========================================                                                                                                                                                                     |  20%
  |                                                                                                                                                                                                                      
  |===========================================                                                                                                                                                                     |  21%
  |                                                                                                                                                                                                                      
  |============================================                                                                                                                                                                    |  21%
  |                                                                                                                                                                                                                      
  |=============================================                                                                                                                                                                   |  21%
  |                                                                                                                                                                                                                      
  |=============================================                                                                                                                                                                   |  22%
  |                                                                                                                                                                                                                      
  |==============================================                                                                                                                                                                  |  22%
  |                                                                                                                                                                                                                      
  |===============================================                                                                                                                                                                 |  22%
  |                                                                                                                                                                                                                      
  |===============================================                                                                                                                                                                 |  23%
  |                                                                                                                                                                                                                      
  |================================================                                                                                                                                                                |  23%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  23%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  24%
  |                                                                                                                                                                                                                      
  |==================================================                                                                                                                                                              |  24%
  |                                                                                                                                                                                                                      
  |===================================================                                                                                                                                                             |  24%
  |                                                                                                                                                                                                                      
  |===================================================                                                                                                                                                             |  25%
  |                                                                                                                                                                                                                      
  |====================================================                                                                                                                                                            |  25%
  |                                                                                                                                                                                                                      
  |=====================================================                                                                                                                                                           |  25%
  |                                                                                                                                                                                                                      
  |=====================================================                                                                                                                                                           |  26%
  |                                                                                                                                                                                                                      
  |======================================================                                                                                                                                                          |  26%
  |                                                                                                                                                                                                                      
  |=======================================================                                                                                                                                                         |  26%
  |                                                                                                                                                                                                                      
  |=======================================================                                                                                                                                                         |  27%
  |                                                                                                                                                                                                                      
  |========================================================                                                                                                                                                        |  27%
  |                                                                                                                                                                                                                      
  |=========================================================                                                                                                                                                       |  27%
  |                                                                                                                                                                                                                      
  |=========================================================                                                                                                                                                       |  28%
  |                                                                                                                                                                                                                      
  |==========================================================                                                                                                                                                      |  28%
  |                                                                                                                                                                                                                      
  |===========================================================                                                                                                                                                     |  28%
  |                                                                                                                                                                                                                      
  |===========================================================                                                                                                                                                     |  29%
  |                                                                                                                                                                                                                      
  |============================================================                                                                                                                                                    |  29%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  29%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  30%
  |                                                                                                                                                                                                                      
  |==============================================================                                                                                                                                                  |  30%
  |                                                                                                                                                                                                                      
  |===============================================================                                                                                                                                                 |  30%
  |                                                                                                                                                                                                                      
  |===============================================================                                                                                                                                                 |  31%
  |                                                                                                                                                                                                                      
  |================================================================                                                                                                                                                |  31%
  |                                                                                                                                                                                                                      
  |=================================================================                                                                                                                                               |  31%
  |                                                                                                                                                                                                                      
  |==================================================================                                                                                                                                              |  31%
  |                                                                                                                                                                                                                      
  |==================================================================                                                                                                                                              |  32%
  |                                                                                                                                                                                                                      
  |===================================================================                                                                                                                                             |  32%
  |                                                                                                                                                                                                                      
  |====================================================================                                                                                                                                            |  32%
  |                                                                                                                                                                                                                      
  |====================================================================                                                                                                                                            |  33%
  |                                                                                                                                                                                                                      
  |=====================================================================                                                                                                                                           |  33%
  |                                                                                                                                                                                                                      
  |======================================================================                                                                                                                                          |  33%
  |                                                                                                                                                                                                                      
  |======================================================================                                                                                                                                          |  34%
  |                                                                                                                                                                                                                      
  |=======================================================================                                                                                                                                         |  34%
  |                                                                                                                                                                                                                      
  |========================================================================                                                                                                                                        |  34%
  |                                                                                                                                                                                                                      
  |========================================================================                                                                                                                                        |  35%
  |                                                                                                                                                                                                                      
  |=========================================================================                                                                                                                                       |  35%
  |                                                                                                                                                                                                                      
  |==========================================================================                                                                                                                                      |  35%
  |                                                                                                                                                                                                                      
  |==========================================================================                                                                                                                                      |  36%
  |                                                                                                                                                                                                                      
  |===========================================================================                                                                                                                                     |  36%
  |                                                                                                                                                                                                                      
  |============================================================================                                                                                                                                    |  36%
  |                                                                                                                                                                                                                      
  |============================================================================                                                                                                                                    |  37%
  |                                                                                                                                                                                                                      
  |=============================================================================                                                                                                                                   |  37%
  |                                                                                                                                                                                                                      
  |==============================================================================                                                                                                                                  |  37%
  |                                                                                                                                                                                                                      
  |==============================================================================                                                                                                                                  |  38%
  |                                                                                                                                                                                                                      
  |===============================================================================                                                                                                                                 |  38%
  |                                                                                                                                                                                                                      
  |================================================================================                                                                                                                                |  38%
  |                                                                                                                                                                                                                      
  |================================================================================                                                                                                                                |  39%
  |                                                                                                                                                                                                                      
  |=================================================================================                                                                                                                               |  39%
  |                                                                                                                                                                                                                      
  |==================================================================================                                                                                                                              |  39%
  |                                                                                                                                                                                                                      
  |==================================================================================                                                                                                                              |  40%
  |                                                                                                                                                                                                                      
  |===================================================================================                                                                                                                             |  40%
  |                                                                                                                                                                                                                      
  |====================================================================================                                                                                                                            |  40%
  |                                                                                                                                                                                                                      
  |====================================================================================                                                                                                                            |  41%
  |                                                                                                                                                                                                                      
  |=====================================================================================                                                                                                                           |  41%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  41%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  42%
  |                                                                                                                                                                                                                      
  |=======================================================================================                                                                                                                         |  42%
  |                                                                                                                                                                                                                      
  |========================================================================================                                                                                                                        |  42%
  |                                                                                                                                                                                                                      
  |========================================================================================                                                                                                                        |  43%
  |                                                                                                                                                                                                                      
  |=========================================================================================                                                                                                                       |  43%
  |                                                                                                                                                                                                                      
  |==========================================================================================                                                                                                                      |  43%
  |                                                                                                                                                                                                                      
  |==========================================================================================                                                                                                                      |  44%
  |                                                                                                                                                                                                                      
  |===========================================================================================                                                                                                                     |  44%
  |                                                                                                                                                                                                                      
  |============================================================================================                                                                                                                    |  44%
  |                                                                                                                                                                                                                      
  |=============================================================================================                                                                                                                   |  44%
  |                                                                                                                                                                                                                      
  |=============================================================================================                                                                                                                   |  45%
  |                                                                                                                                                                                                                      
  |==============================================================================================                                                                                                                  |  45%
  |                                                                                                                                                                                                                      
  |===============================================================================================                                                                                                                 |  45%
  |                                                                                                                                                                                                                      
  |===============================================================================================                                                                                                                 |  46%
  |                                                                                                                                                                                                                      
  |================================================================================================                                                                                                                |  46%
  |                                                                                                                                                                                                                      
  |=================================================================================================                                                                                                               |  46%
  |                                                                                                                                                                                                                      
  |=================================================================================================                                                                                                               |  47%
  |                                                                                                                                                                                                                      
  |==================================================================================================                                                                                                              |  47%
  |                                                                                                                                                                                                                      
  |===================================================================================================                                                                                                             |  47%
  |                                                                                                                                                                                                                      
  |===================================================================================================                                                                                                             |  48%
  |                                                                                                                                                                                                                      
  |====================================================================================================                                                                                                            |  48%
  |                                                                                                                                                                                                                      
  |=====================================================================================================                                                                                                           |  48%
  |                                                                                                                                                                                                                      
  |=====================================================================================================                                                                                                           |  49%
  |                                                                                                                                                                                                                      
  |======================================================================================================                                                                                                          |  49%
  |                                                                                                                                                                                                                      
  |=======================================================================================================                                                                                                         |  49%
  |                                                                                                                                                                                                                      
  |=======================================================================================================                                                                                                         |  50%
  |                                                                                                                                                                                                                      
  |========================================================================================================                                                                                                        |  50%
  |                                                                                                                                                                                                                      
  |=========================================================================================================                                                                                                       |  50%
  |                                                                                                                                                                                                                      
  |=========================================================================================================                                                                                                       |  51%
  |                                                                                                                                                                                                                      
  |==========================================================================================================                                                                                                      |  51%
  |                                                                                                                                                                                                                      
  |===========================================================================================================                                                                                                     |  51%
  |                                                                                                                                                                                                                      
  |===========================================================================================================                                                                                                     |  52%
  |                                                                                                                                                                                                                      
  |============================================================================================================                                                                                                    |  52%
  |                                                                                                                                                                                                                      
  |=============================================================================================================                                                                                                   |  52%
  |                                                                                                                                                                                                                      
  |=============================================================================================================                                                                                                   |  53%
  |                                                                                                                                                                                                                      
  |==============================================================================================================                                                                                                  |  53%
  |                                                                                                                                                                                                                      
  |===============================================================================================================                                                                                                 |  53%
  |                                                                                                                                                                                                                      
  |===============================================================================================================                                                                                                 |  54%
  |                                                                                                                                                                                                                      
  |================================================================================================================                                                                                                |  54%
  |                                                                                                                                                                                                                      
  |=================================================================================================================                                                                                               |  54%
  |                                                                                                                                                                                                                      
  |=================================================================================================================                                                                                               |  55%
  |                                                                                                                                                                                                                      
  |==================================================================================================================                                                                                              |  55%
  |                                                                                                                                                                                                                      
  |===================================================================================================================                                                                                             |  55%
  |                                                                                                                                                                                                                      
  |===================================================================================================================                                                                                             |  56%
  |                                                                                                                                                                                                                      
  |====================================================================================================================                                                                                            |  56%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================                                                                                           |  56%
  |                                                                                                                                                                                                                      
  |======================================================================================================================                                                                                          |  56%
  |                                                                                                                                                                                                                      
  |======================================================================================================================                                                                                          |  57%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================                                                                                         |  57%
  |                                                                                                                                                                                                                      
  |========================================================================================================================                                                                                        |  57%
  |                                                                                                                                                                                                                      
  |========================================================================================================================                                                                                        |  58%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================                                                                                       |  58%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  58%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  59%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================                                                                                     |  59%
  |                                                                                                                                                                                                                      
  |============================================================================================================================                                                                                    |  59%
  |                                                                                                                                                                                                                      
  |============================================================================================================================                                                                                    |  60%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================                                                                                   |  60%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================                                                                                  |  60%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================                                                                                  |  61%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================                                                                                 |  61%
  |                                                                                                                                                                                                                      
  |================================================================================================================================                                                                                |  61%
  |                                                                                                                                                                                                                      
  |================================================================================================================================                                                                                |  62%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================                                                                               |  62%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================                                                                              |  62%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================                                                                              |  63%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================                                                                             |  63%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================                                                                            |  63%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================                                                                            |  64%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================                                                                           |  64%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================                                                                          |  64%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================                                                                          |  65%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================                                                                         |  65%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================                                                                        |  65%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================                                                                        |  66%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================                                                                       |  66%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================                                                                      |  66%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================                                                                      |  67%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================                                                                     |  67%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================                                                                    |  67%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================                                                                    |  68%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================                                                                   |  68%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================                                                                  |  68%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================                                                                  |  69%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================                                                                 |  69%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================                                                                |  69%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================                                                               |  69%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================                                                               |  70%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================                                                              |  70%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  70%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  71%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================                                                            |  71%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================                                                           |  71%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================                                                           |  72%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================                                                          |  72%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================                                                         |  72%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================                                                         |  73%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================                                                        |  73%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================                                                       |  73%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================                                                       |  74%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================                                                      |  74%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================                                                     |  74%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================                                                     |  75%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================                                                    |  75%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================                                                   |  75%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================                                                   |  76%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================                                                  |  76%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  76%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  77%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================                                                |  77%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================                                               |  77%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================                                               |  78%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================                                              |  78%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================                                             |  78%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================                                             |  79%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================                                            |  79%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================                                           |  79%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================                                           |  80%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================                                          |  80%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================                                         |  80%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================                                         |  81%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================                                        |  81%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================                                       |  81%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================                                      |  81%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================                                      |  82%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================                                     |  82%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================                                    |  82%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================                                    |  83%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================                                   |  83%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================                                  |  83%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================                                  |  84%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================================                                 |  84%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================                                |  84%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================                                |  85%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================================                               |  85%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================                              |  85%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================                              |  86%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================================                             |  86%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================                            |  86%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================                            |  87%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================                           |  87%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================                          |  87%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================                          |  88%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================                         |  88%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  88%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  89%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================                       |  89%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================                      |  89%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================                      |  90%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================                     |  90%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================                    |  90%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================                    |  91%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================                   |  91%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================                  |  91%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================                  |  92%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================================================                 |  92%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================                |  92%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================                |  93%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================================================               |  93%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================================              |  93%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================================              |  94%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================================================             |  94%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================================            |  94%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================================           |  94%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================================           |  95%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================================          |  95%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================================         |  95%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================================         |  96%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================================        |  96%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================================       |  96%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================================       |  97%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================================      |  97%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================================     |  97%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================================     |  98%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================================    |  98%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================   |  98%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================   |  99%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================================  |  99%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================== |  99%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================== | 100%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                                                                                                                      
  |                                                                                                                                                                                                                |   0%
  |                                                                                                                                                                                                                      
  |============                                                                                                                                                                                                    |   6%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  12%
  |                                                                                                                                                                                                                      
  |=====================================                                                                                                                                                                           |  18%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  24%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  29%
  |                                                                                                                                                                                                                      
  |=========================================================================                                                                                                                                       |  35%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  41%
  |                                                                                                                                                                                                                      
  |==================================================================================================                                                                                                              |  47%
  |                                                                                                                                                                                                                      
  |==============================================================================================================                                                                                                  |  53%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  59%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================                                                                         |  65%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  71%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  76%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================                                     |  82%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  88%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================================            |  94%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================================| 100%

Save raw object

saveRDS(cmp.object, file = paste0(projectName, "_raw.RDS"))
cmp.object <- RunPCA(cmp.object, features = VariableFeatures(cmp.object), ndims.print = 1:5, nfeatures.print = 5)
PC_ 1 
Positive:  Vamp5, Nkg7, Car2, Apoe, Ctla2a 
Negative:  Lgals3, Aif1, Id2, Cst3, H2-Aa 
PC_ 2 
Positive:  Prtn3, Ctsg, H2afy, Mpo, Emb 
Negative:  Ube2c, Cenpf, Nusap1, Mki67, Cenpa 
PC_ 3 
Positive:  Pf4, Tmsb4x, Cavin2, Serpine2, Rap1b 
Negative:  Plac8, Cks2, Cenpa, Ube2c, Tubb4b 
PC_ 4 
Positive:  Csrp3, Car1, Jun, Apoe, Jund 
Negative:  H2afz, Hmgn2, Birc5, Hmgb1, Tuba1b 
PC_ 5 
Positive:  Pclaf, Tyms, Rrm2, Tk1, Pcna 
Negative:  Hist1h2bc, Tsc22d1, Smim14, Ccnb2, Serpinb1a 
DimPlot(cmp.object, reduction = "pca", group.by = "orig.ident")

VizDimLoadings(cmp.object, dims = 1:6, nfeatures = 10, reduction = "pca", ncol = 3)

Calculate dimensionality

ElbowPlot(cmp.object, ndims = 50)
percent.variance(cmp.object@reductions$pca@stdev)

Number of PCs describing X% of variance

ElbowPlot(cmp.object, ndims = 50)

percent.variance(cmp.object@reductions$pca@stdev)

Add cluster IDs from Seurat v1

Exported cell IDs for clusters 3, 17, 10, 11 from Seurat v1. Will add these IDs as a metadata column.
Create column “clust.ID” and populate with 0’s. Then import IDs for clusters

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
paste0("Num pcs for 80% variance:", length(which(cumsum(tot.var) <= 80)))
[1] "Num pcs for 80% variance:18"
paste0("Num pcs for 85% variance:", length(which(cumsum(tot.var) <= 85)))
[1] "Num pcs for 85% variance:25"
paste0("Num pcs for 90% variance:", length(which(cumsum(tot.var) <= 90)))
[1] "Num pcs for 90% variance:33"
paste0("Num pcs for 95% variance:", length(which(cumsum(tot.var) <= 95)))
[1] "Num pcs for 95% variance:41"

Add new metadata column

clust3.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster3cellIDs.txt", col.names = "clust03")
clust3.cells <- sapply(clust3.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust17.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster17cellIDs.txt", col.names = "clust17")
clust17.cells <- sapply(clust17.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust10.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster10cellIDs.txt", col.names = "clust10")
clust10.cells <- sapply(clust10.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust11.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster11cellIDs.txt", col.names = "clust11")
clust11.cells <- sapply(clust11.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))

now map new ids

cmp.object@meta.data['clust.ID'] <- 0
head(cmp.object@meta.data)
Registered S3 method overwritten by 'cli':
  method     from         
  print.boxx spatstat.geom

do numbers make sense?

cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust3.cells] <- 3
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust17.cells] <- 17
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust10.cells] <- 10
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust11.cells] <- 11

Identify variable genes for new biomark

nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 10,])
[1] 1049
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 11,])
[1] 1118
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 17,])
[1] 883
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 3,])
[1] 1931
length(cmp.object@assays$RNA@var.features)
[1] 2000

Total var 90%

Neighborhood and umap

set total.var <- 90%

top100.var <- cmp.object@assays$RNA@var.features[1:100]
length(top100.var)
[1] 100

Plot UMAP

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 90))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
Computing nearest neighbor graph
Computing SNN
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8502
Number of communities: 9
Elapsed time: 1 seconds
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
13:50:56 UMAP embedding parameters a = 0.9922 b = 1.112
13:50:56 Read 12059 rows and found 33 numeric columns
13:50:56 Using Annoy for neighbor search, n_neighbors = 30
13:50:56 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
13:50:57 Writing NN index file to temp file /var/folders/4f/fwrj6fnn1dn4g8wsf0zv563hjsvl24/T//Rtmp5gGDJN/file582a292245c6
13:50:57 Searching Annoy index using 1 thread, search_k = 3000
13:50:59 Annoy recall = 100%
13:51:00 Commencing smooth kNN distance calibration using 1 thread
13:51:00 Initializing from normalized Laplacian + noise
13:51:01 Commencing optimization for 200 epochs, with 513294 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
13:51:06 Optimization finished
for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8502
Number of communities: 9
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7974
Number of communities: 17
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7652
Number of communities: 22
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7404
Number of communities: 27
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7189
Number of communities: 30
Elapsed time: 1 seconds
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))

Clustree

what’s the max resolution we can achieve while keepign clusters stable?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}
Error in DimPlot(cmp.object, group.by = meta.col, reduction = "umap",  : 
  object 'color.palette' not found

I think I’m liking res.1.0 from this. Although how much does this change if I use fewer PCs…

for each resolution, number/percentage of cells in each cluster?

plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
Error: Less than two column names matched the prefix: RNA_snn_res.

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

tot.cells <- nrow(cmp.object@meta.data)
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        stats.df <- data.frame(matrix(ncol = 2, nrow = length(new.clusters)))
        colnames(stats.df) <- c("num_cells", "pct_pop")
        rownames(stats.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(stats.df)){
                num.x <- nrow(meta.df[meta.df[meta.col] == row.id,])
                pct.x <- as.integer(num.x / tot.cells *100)
                # print(pct.x)
                stats.df[row.id, "num_cells"] <- num.x
                stats.df[row.id, "pct_pop"] <- pct.x
        }
        print(stats.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}
NA
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)

Total var 85%

Neighborhood and umap

set total.var <- 85%

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Plot UMAP

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 85))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
Computing nearest neighbor graph
Computing SNN
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8508
Number of communities: 9
Elapsed time: 2 seconds
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
11:05:25 UMAP embedding parameters a = 0.9922 b = 1.112
11:05:25 Read 12059 rows and found 25 numeric columns
11:05:25 Using Annoy for neighbor search, n_neighbors = 30
11:05:25 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
11:05:26 Writing NN index file to temp file /var/folders/4f/fwrj6fnn1dn4g8wsf0zv563hjsvl24/T//RtmpN5aoAI/file18065624a624
11:05:26 Searching Annoy index using 1 thread, search_k = 3000
11:05:30 Annoy recall = 100%
11:05:30 Commencing smooth kNN distance calibration using 1 thread
11:05:31 Initializing from normalized Laplacian + noise
11:05:31 Commencing optimization for 200 epochs, with 500658 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
11:05:38 Optimization finished
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))
for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8508
Number of communities: 9
Elapsed time: 2 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8026
Number of communities: 18
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7700
Number of communities: 22
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7461
Number of communities: 28
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7257
Number of communities: 33
Elapsed time: 1 seconds

Clustree

what’s the max resolution we can achieve while keepign clusters stable?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

for each resolution, number/percentage of cells in each cluster?

tot.cells <- nrow(cmp.object@meta.data)
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        stats.df <- data.frame(matrix(ncol = 2, nrow = length(new.clusters)))
        colnames(stats.df) <- c("num_cells", "pct_pop")
        rownames(stats.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(stats.df)){
                num.x <- nrow(meta.df[meta.df[meta.col] == row.id,])
                pct.x <- as.integer(num.x / tot.cells *100)
                # print(pct.x)
                stats.df[row.id, "num_cells"] <- num.x
                stats.df[row.id, "pct_pop"] <- pct.x
        }
        print(stats.df)
    }
}

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Total var 95%

Neighborhood and umap

set total.var <- 95%

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 95))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)

saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))

Plot UMAP

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 95))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
Computing nearest neighbor graph
Computing SNN
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 478535

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8472
Number of communities: 9
Elapsed time: 1 seconds
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)
07:23:01 UMAP embedding parameters a = 0.9922 b = 1.112
07:23:01 Read 12059 rows and found 41 numeric columns
07:23:01 Using Annoy for neighbor search, n_neighbors = 30
07:23:01 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
07:23:02 Writing NN index file to temp file /var/folders/4f/fwrj6fnn1dn4g8wsf0zv563hjsvl24/T//Rtmp6Y3Oqu/file12bf353fef34f
07:23:02 Searching Annoy index using 1 thread, search_k = 3000
07:23:06 Annoy recall = 100%
07:23:06 Commencing smooth kNN distance calibration using 1 thread
07:23:07 Initializing from normalized Laplacian + noise
07:23:08 Commencing optimization for 200 epochs, with 524686 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
07:23:15 Optimization finished
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))
for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 478535

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8472
Number of communities: 9
Elapsed time: 2 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 478535

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7908
Number of communities: 17
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 478535

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7591
Number of communities: 20
Elapsed time: 2 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 478535

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7332
Number of communities: 26
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 478535

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7121
Number of communities: 32
Elapsed time: 1 seconds
cmp.object <- readRDS("CMP_dim41.RDS")

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                pt.size = .1,
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Gene expression of old clustrs on new map

Let’s see if we can get some gene expression profiles on these…

gene.list <- c("Gata1", "Gata2", "Pf4", "Dntt", "Mpo", "Meis1", "Irf8", "Elane", "Fli1", "Zfpm1")
VlnPlot(cmp.object, features = gene.list, group.by = "clust.ID", pt.size = 0.01, cols = c("gray", "orange", "blue", "red", "green"))

Used the exce doc to do some fancy conditional formatting. Old cluster 17 is pretty dispersed until you it resolution 2.5. Otherise, cells in old cluster 17 do not constitute more than 40% of any cells in the new clusters.
As far as I can see, the two approaches are to do DGEof new CMP w/ resolution = 2.5, AND/OR do DGe using older cluster IDs. Sure seems to make sense to do both…

DGE w/ resolution = 2.5

Strt with comparing all clusters against all other clusters Write out cluster info

calculate FindAllMarkers() for different idents and save to new file

ident.list <- c("RNA_snn_res.0.5", "RNA_snn_res.1", "RNA_snn_res.1.5", "RNA_snn_res.2", "RNA_snn_res.2.5", "clust.ID")
for(tested.ident in ident.list){
    Idents(cmp.object) <- tested.ident
    all.markers <- FindAllMarkers(cmp.object)
    xlsx::write.xlsx(x = all.markers[,c("avg_log2FC", "p_val_adj", "cluster", "gene")], 
                                     file = paste0(projectName, "_FindALLMarkers_res2.5.xlsx"), 
                                     sheetName = tested.ident, 
                                     col.names = TRUE, 
                                     row.names = FALSE, 
                                     append = TRUE)
}

Create FindAllMarkers() lists for GSEA

Idents(cmp.object) <- "RNA_snn_res.2.5"
res.2.5.allmarkers <- FindAllMarkers(cmp.object)

Map HGNC symbols

Mouse2HumanTable <- Mouse2Human(res.2.5.allmarkers$gene)

HGNC <- with(Mouse2HumanTable, Mouse2HumanTable$HGNC[match(res.2.5.allmarkers$gene, Mouse2HumanTable$MGI)])
head(res.2.5.allmarkers)
res.2.5.allmarkers$HGNC <- HGNC
tail(res.2.5.allmarkers)
sig.res.2.5 <- res.2.5.allmarkers[res.2.5.allmarkers$p_val_adj <= 0.05, ]
sig.res.2.5 <- sig.res.2.5[c("avg_log2FC", "HGNC", "cluster")]
sig.res.2.5 <- sig.res.2.5[!(sig.res.2.5$HGNC == "" | is.na(sig.res.2.5$HGNC)),] # GSEA will fail if there are any blanks or NAs in the table
sig.res.2.5 <- sig.res.2.5[]
for(cluster in unique(sig.res.2.5$cluster)){
    print(paste("writing cluster", cluster))
    new.table <- sig.res.2.5[sig.res.2.5$cluster == cluster, c("HGNC", "avg_log2FC")]
    new.table <- new.table[order(-new.table$avg_log2FC), ]
    write.table(new.table, file = paste0("RankList_res2.5_findAll_hgnc/res.2.5cluster", cluster, ".rnk"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = "\t", )
    
}

calculate FindMarkers() that distinguish each cluster (might overlab between clusters)

ident.list <- c("RNA_snn_res.0.5", "RNA_snn_res.1", "RNA_snn_res.1.5", "RNA_snn_res.2", "RNA_snn_res.2.5", "clust.ID")
for(tested.ident in ident.list){
    object.copy <- cmp.object
    Idents(object.copy) <- tested.ident
    print(paste("testing", tested.ident))
    for (cluster in sort(as.numeric(levels(object.copy@meta.data[[tested.ident]])))){
        print(paste("looking at cluster", cluster))
        cluster.markers <- FindMarkers(object.copy, ident.1 = cluster)
        try(
            xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                             file = paste0(projectName, "_FindMarkers_", gsub("RNA_snn_", "", tested.ident), ".xlsx"), 
                                             sheetName = paste0("clst", cluster), 
                                             col.names = TRUE, 
                                             row.names = TRUE, 
                                             append = TRUE)
        )   
    }
    remove(object.copy)
}
for (cluster in sort(as.numeric(levels(cmp.object@meta.data$RNA_snn_res.2.5)))){
    cluster.markers <- FindMarkers(cmp.object, ident.1 = cluster)
    xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                     file = paste0(projectName, "_FindMarkers_res2.5.xlsx"), 
                                     sheetName = paste0("clst", cluster), 
                                     col.names = TRUE, 
                                     row.names = TRUE, 
                                     append = TRUE)
}

Combine clusters that might represent old cluster ids

DGE w/ metadata against clust.ID against “0”

reset ident as “clust.ID” and rerun FindAllMarkers()

    Idents(cmp.object) <- "clust.ID"
    all.markers <- FindAllMarkers(cmp.object)
    xlsx::write.xlsx(x = all.markers[,c("avg_log2FC", "p_val_adj", "cluster", "gene")], 
                                     file = paste0(projectName, "_FindALLMarkers_clustID.xlsx"), 
                                     sheetName = "clustID", 
                                     col.names = TRUE, 
                                     row.names = FALSE, 
                                     append = TRUE)
# Idents(cmp.object) <- "clust.ID"
for (cluster in unique(cmp.object@meta.data$clust.ID)){
    print(cluster)
    cluster.markers <- FindMarkers(cmp.object, ident.1 = cluster)
    xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                     file = paste0(projectName, "_FindMarkers_clustID.xlsx"), 
                                     sheetName = paste0("oldclust", cluster), 
                                     col.names = TRUE, 
                                     row.names = TRUE, 
                                     append = TRUE)
}

Distinguishing features of clusters

Previously defined biomark genes based on PC contributions. Original list was based on all msAggr, but let’s see how CMP subset does?

VizDimLoadings(cmp.object, dims = 1:10, nfeatures = 30, reduction = "pca", ncol = 2)
pca.df <- cmp.object[["pca"]]
pca.df <- as.data.frame(as.matrix(slot(object = pca.df, name = "feature.loadings")))
print(cmp.object[["pca"]], dims = 2, nfeatures = 5)
rownames(pca.df[pca.df$PC_2 %in% sort(pca.df$PC_2, decreasing = TRUE)[1:5], ])
rownames(pca.df[pca.df$PC_2 %in% sort(pca.df$PC_2)[1:5], ])

now we can get a list of principal components!
first pull the list of oldAnalysis CMP top PC genes

cmp.biomark <- read.table(file = "/Users/heustonef/Desktop/CMPSubpops/BioMark/ProbePanels/CMP_PCTopGenes.txt", sep = "\t", header = TRUE)
biomark.cmptargets <- c()
for(df.col in 1:ncol(cmp.biomark)){
    biomark.cmptargets <- c(biomark.cmptargets, biomark[,df.col])
}
print(colnames(biomark))
print(paste("total gene count:", length(biomark.cmptargets)))

Now get the list of current pc gene trgets (oldAnalysis used ndim = 1:6, so we’ll start with that range)

pc.list <- c("PC_1", "PC_2", "PC_3", "PC_4", "PC_5", "PC_6")
pc.genes <- lapply(pc.list, function(x) rownames(pca.df[pca.df[[x]] %in% sort(pca.df[[x]], decreasing = TRUE)[1:30],])) #targeting roughly 180 genes like in biomark.cmptargets
pc.genes <- unique(unlist(pc.genes))
print(paste("total gene count:", length(pc.genes)))

Now compare the lists, I guess:

# setdiff(x,y) gives you things in x not in y. setdiff(y,x) gives you things in y not in x
setdiff(biomark.cmptargets, pc.genes)
# print(paste("\n length:", length(setdiff(biomark.cmptargets, pc.genes))))
writeLines(c("", "length:", length(setdiff(biomark.cmptargets, pc.genes))))

Umm, yeah that went kinda how I expected. Let’s do this again, but for the actual biomark gene lists.

biomark <- read.table(file = "/Users/heustonef/Desktop/CMPSubpops/BioMark/ProbePanels/BiomarkProbeList.txt", sep = "\t")
biomark <- biomark[,1]
setdiff(biomark, pc.genes)
writeLines(c("", "length:", length(setdiff(biomark, pc.genes))))

What if we increase the number of pcs but decrease the depth of each? This might cover more of biomark, which was originally developed using msAggr instead of only the CMP subset

pc.list <- c("PC_1", "PC_2", "PC_3", "PC_4", "PC_5", "PC_6", "PC_7", "PC_8", "PC_9", "PC_10")
pc.genes <- lapply(pc.list, function(x) rownames(pca.df[pca.df[[x]] %in% sort(pca.df[[x]], decreasing = TRUE)[1:20],]))
pc.genes <- unique(unlist(pc.genes))
print(paste("total gene count:", length(pc.genes)))
setdiff(biomark, pc.genes)
writeLines(c("", "length:", length(setdiff(biomark, pc.genes))))

For comparison, let’s just see how many of biomark.cmptargets were actually included in biomark

setdiff(biomark.cmptargets, biomark)
writeLines(c("", "length:", length(setdiff(biomark.cmptargets, pc.genes))))
length(biomark) - length(setdiff(biomark, biomark.cmptargets))
length(biomark) - length(setdiff(biomark, pc.genes))

So when you look at it like that, it’s not actually that far off.

What are the similarities?:

setdiff(setdiff(biomark, biomark.cmptargets), setdiff(biomark, pc.genes))

These are genes from the 97probes not in the old CMP set that are also not in the new CMP set. Other than Itga2b (which is a failed probe anyway), nothing screams. Also we’d have thrown Flt3 and Cd34 for in anyway because they’re requisite cell surface markers (also Flt3 surface marker is expensive but otherwise not noteworthy and not used in the current sorting strategy)

What about cell surface marker expression? * Cd34 * Cd16/32 * Cd9 * Cd41 * Cd48 * Sca1 (just throw that in for sh*&s and giggles)

surface.markers <- c("Cd34", "Fcgr3", "Fcgr2b", "Cd9", "Itga2b", "Cd48", "Ly6a")
FeaturePlot(cmp.object, features = surface.markers, pt.size = 1, split.by = "clust.ID", ncol = 1)

Save as png

png(filename = "FeaturePlot_CMP_surfaceMarkers_clustIDfacet.png", height = 1600, width = 1600)
FeaturePlot(cmp.object, features = surface.markers, pt.size = 1, split.by = "clust.ID", ncol = 1)
dev.off()

Compare @g hierarchcial clusteirng

Do clustering using biomark RNAs as input

# Read in BiomarkRNAs
biomark.rnas <- read.table('/Users/heustonef/Desktop/10XGenomicsData/BiomarkRNAs.txt')
biomark.rnas <- biomark.rnas$V1

use biomark RNAs to define dimensional reduction

cmp.object <- readRDS("CMP_raw.RDS")
cmp.object <- RunPCA(cmp.object, features = biomark.rnas, ndims.print = 1:5, , nfeatures.print = 5)
ElbowPlot(cmp.object, ndims = 50)

Now run the clustering

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 90))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)

find the clusters

for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}

Plot the umaps and cell cluster ids

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

Calculate anticipated number of cells you’ll find in each biomark cluster

Get # cells in each cluster

tot.cellcount <- nrow(cmp.object@meta.data)
res05.list <- sort(unique(cmp.object@meta.data$RNA_snn_res.0.5), decreasing = FALSE)
sapply(res05.list, 
             function(x){
                print(
                    paste(
                        "cluster", x, "=", 
                        nrow(cmp.object@meta.data[cmp.object@meta.data$RNA_snn_res.0.5 == x,]), 
                        "cells or", 
                        round(nrow(cmp.object@meta.data[cmp.object@meta.data$RNA_snn_res.0.5 == x,])/tot.cellcount*100, digits = 2), 
                        "% of total"
                    )
                )
             }
            )

So we did the dimensional reduction based on the biomark RNAs, then did our UMAP nearest neighbor clustering.

In the biomark hierarchcial clustering analysis I assayed 167 cells. The smallest cluster I detected had 3 cells, or 1.8% of total, and this is an uncomfortably small number of cells. Based on the UMAP calculations I would therefore expect to find 11 or 12 of the predicted 15 clusters. I found 12, and I don’t really like that last one, so 11 or 12. Since I did the hierarchcial clustering yesterday and did this math today, we can say it was independent of these results and therefore totally legit. Yay!!

LS0tCnRpdGxlOiAiQ01QU3Vic2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIFVwZGF0ZXMKCiMjIFVwZGF0ZSAyMDIxLjA4LjExCk1vc3QgdGhvcm91Z2ggd2F5IHRvIHJlYWRkcmVzcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBjdXJyZW50IGFuYWx5c2VzIGlzIHRvIGpzdXQgcmVkbyB0aGUgYmlvbWFyay4gVG8gdGhhdCBlbmQsIHdpbGwgcmVzdGFydCBhbmFseXNpcyBvZiAqanVzdCogQ01QbTIsIGV4Y2x1ZGluZyBvdGhlciBkYXRhc2V0cyAoaS5lLiwgTFNLLCBNRVAsIEdNUCkuIFdpbGwgYWxzbyBrZWVwIAoKCiMgTm90ZWJvb2sgc2V0dXAKCkNyZWF0aW5nIG5ldyBwaXBlbGluZSB1c2luZyBzZXVyYXQgdjQuMC4yIGF2YWlsYWJsZSAyMDIxLjA2LjA4CgpMb2FkIGxpYnJhcmllcyByZXF1aXJlZCBmb3IgU2V1cmF0djQKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjbHVzdHJlZSkKYGBgCgojIFNldCBnbG9iYWwgdmFyaWFibGVzCmBgYHtyfQpwcm9qZWN0TmFtZSA8LSAiQ01QIgpqYWNrc3RyYXcuZGltIDwtIDQwCmBgYAoKc3RvcmUgc2Vzc2lvbiBpbmZvCmBgYHtyfQpzZXNzaW9uSW5mby5maWxlbmFtZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJfc2Vzc2lvbkluZm8udHh0IikKc2luayhzZXNzaW9uSW5mby5maWxlbmFtZSkKc2Vzc2lvbkluZm8oKQpzaW5rKCkKYGBgCgoKYGBge3J9CnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9yZWFkXzEwWEdlbm9taWNzX2RhdGEuUiIpCnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9QZXJjZW50VmFyaWFuY2UuUiIpCnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9Nb3VzZTJIdW1hbl9pZGNvbnZlcnNpb24uUiIpCmBgYAoKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CnNldHdkKCIuLi8uLi9jZWxsUmFuZ2VyLyIpICMgdGVtcG9yYXJpbHkgY2hhbmdpbmcgd2Qgb25seSB3b3JrcyBpZiB5b3UgcnVuIHRoZSBlbnRpcmUgY2h1bmsgYXQgb25jZQpkYXRhX2ZpbGUubGlzdCA8LSByZWFkXzEwWEdlbm9taWNzX2RhdGEoc2FtcGxlLmxpc3QgPSAiQ01QbTIiKQpvYmplY3QuZGF0YSA8LVJlYWQxMFgoZGF0YV9maWxlLmxpc3QpCmBgYAoKCgpgYGB7cn0KY21wLm9iamVjdDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSBvYmplY3QuZGF0YSwgbWluLmNlbGxzID0gMywgbWluLmdlbmVzID0gMjAwLCBwcm9qZWN0ID0gcHJvamVjdE5hbWUpCmBgYAoKQ2xlYW4gdXAgdG8gZnJlZSBtZW1vcnkKCmBgYHtyfQpyZW1vdmUob2JqZWN0LmRhdGEpCmBgYAoKCkFkZCBtaXRvY2hvbmRyaWFsIG1ldGFkYXRhIGFuZCBwbG90IHNvbWUgYmFzaWMgZmVhdHVyZXMKYGBge3J9CmNtcC5vYmplY3RbWyJwZXJjZW50Lm10Il1dIDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KGNtcC5vYmplY3QsIHBhdHRlcm4gPSAiXm10LSIpClZsblBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIsICJwZXJjZW50Lm10IiksIG5jb2wgPSAzLCBwdC5zaXplID0gMCwgZmlsbC5ieSA9ICdvcmlnLmlkZW50JywgKQpgYGAKCgpgYGB7cn0KcGxvdDEgPC0gRmVhdHVyZVNjYXR0ZXIoY21wLm9iamVjdCwgZmVhdHVyZTEgPSAibkNvdW50X1JOQSIsIGZlYXR1cmUyID0gInBlcmNlbnQubXQiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IiwgcHQuc2l6ZSA9IDAuMDEpCnBsb3QyIDwtIEZlYXR1cmVTY2F0dGVyKGNtcC5vYmplY3QsIGZlYXR1cmUxID0gIm5Db3VudF9STkEiLCBmZWF0dXJlMiA9ICJuRmVhdHVyZV9STkEiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IiwgcHQuc2l6ZSA9IDAuMDEpCnBsb3QxICsgcGxvdDIKYGBgCiMjIEZpbHRlciBkYXRhCnJlbW92ZSBsb3cgcXVhbGl0eSBjZWxscwpyZXF1aXJlOiBuRmVhdHVyZV9STkEgYmV0d2VlbiAyMDAgYW5kIDQwMDAgKGluY2x1c2l2ZSkKcmVxdWlyZTogcGVyY2VudC5tdCA8PTUKCmBgYHtyfQpwcmludChwYXN0ZSgib3JpZ2luYWwgb2JqZWN0OiIsIG5yb3coY21wLm9iamVjdEBtZXRhLmRhdGEpLCAiY2VsbHMiLCBzZXAgPSAiICIpKQpjbXAub2JqZWN0IDwtIHN1YnNldChjbXAub2JqZWN0LCAKCQkJCQkJCQkJCQkJc3Vic2V0ID0gbkZlYXR1cmVfUk5BID49MjAwICYgCgkJCQkJCQkJCQkJCQluRmVhdHVyZV9STkEgPD0gNDAwMCAmIAoJCQkJCQkJCQkJCQkJcGVyY2VudC5tdCA8PSA1CgkJCQkJCQkJCQkJCSkKcHJpbnQocGFzdGUoIm5ldyBvYmplY3Q6IiwgbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YSksICJjZWxscyIsIHNlcCA9ICIgIikpCmBgYAoKCgpgYGB7cn0KY21wLm9iamVjdCA8LSBOb3JtYWxpemVEYXRhKGNtcC5vYmplY3QsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkxvZ05vcm1hbGl6ZSIsIHNjYWxlLmZhY3RvciA9IDEwMDAwKQpgYGAKCgpGaW5kIHZhcmlhYmxlIGZlYXR1cmVzCmBgYHtyIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSAyfQpjbXAub2JqZWN0IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKGNtcC5vYmplY3QsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKdG9wMTAgPC0gaGVhZChWYXJpYWJsZUZlYXR1cmVzKGNtcC5vYmplY3QpLCAxMCkKcGxvdDEgPC0gVmFyaWFibGVGZWF0dXJlUGxvdChjbXAub2JqZWN0KQpwbG90MiA8LSBMYWJlbFBvaW50cyhwbG90ID0gcGxvdDEsIHBvaW50cyA9IHRvcDEwLCByZXBlbCA9IFRSVUUpCnBsb3QxICsgcGxvdDIKYGBgCgojIyBTY2FsZSBkYXRhIChsaW5lYXIgdHJhbnNmb3JtYXRpb24pCldlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgY29tcGFyaW5nIGxpYnJhcnkgZGVwdGhzLCBzbyB3ZSdsbCBqdXN0IGRvIG5vcm1hbGl6YXRpb24vU2NhbGUgZGF0YQoKYGBge3IgZWNobyA9IEZBTFNFfQphbGwuZ2VuZXMgPC0gcm93bmFtZXMoY21wLm9iamVjdCkKY21wLm9iamVjdCA8LSBTY2FsZURhdGEoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBhbGwuZ2VuZXMsIHZhcnMudG8ucmVncmVzcyA9IGMoIm5GZWF0dXJlX1JOQSIsICJuQ291bnRfUk5BIikpCmBgYAoKIyMgU2F2ZSByYXcgb2JqZWN0CmBgYHtyfQpzYXZlUkRTKGNtcC5vYmplY3QsIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfcmF3LlJEUyIpKQpgYGAKCgoKYGBge3J9CmNtcC5vYmplY3QgPC0gUnVuUENBKGNtcC5vYmplY3QsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhjbXAub2JqZWN0KSwgbmRpbXMucHJpbnQgPSAxOjUsIG5mZWF0dXJlcy5wcmludCA9IDUpCmBgYAoKYGBge3J9CkRpbVBsb3QoY21wLm9iamVjdCwgcmVkdWN0aW9uID0gInBjYSIsIGdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiKQpWaXpEaW1Mb2FkaW5ncyhjbXAub2JqZWN0LCBkaW1zID0gMTo2LCBuZmVhdHVyZXMgPSAxMCwgcmVkdWN0aW9uID0gInBjYSIsIG5jb2wgPSAzKQoKYGBgCgpDYWxjdWxhdGUgZGltZW5zaW9uYWxpdHkKYGBge3IsIGZpZ3VyZXMtc2lkZSwgZmlnLnNob3c9J2hvbGQnLCBvdXQud2lkdGg9IjUwJSJ9CkVsYm93UGxvdChjbXAub2JqZWN0LCBuZGltcyA9IDUwKQpwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYpCmBgYApOdW1iZXIgb2YgUENzIGRlc2NyaWJpbmcgWCUgb2YgdmFyaWFuY2UKCmBgYHtyfQp0b3QudmFyIDwtIHBlcmNlbnQudmFyaWFuY2UoY21wLm9iamVjdEByZWR1Y3Rpb25zJHBjYUBzdGRldiwgcGxvdC52YXIgPSBGQUxTRSwgcmV0dXJuLnZhbCA9IFRSVUUpCnBhc3RlMCgiTnVtIHBjcyBmb3IgODAlIHZhcmlhbmNlOiIsIGxlbmd0aCh3aGljaChjdW1zdW0odG90LnZhcikgPD0gODApKSkKcGFzdGUwKCJOdW0gcGNzIGZvciA4NSUgdmFyaWFuY2U6IiwgbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA4NSkpKQpwYXN0ZTAoIk51bSBwY3MgZm9yIDkwJSB2YXJpYW5jZToiLCBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDkwKSkpCnBhc3RlMCgiTnVtIHBjcyBmb3IgOTUlIHZhcmlhbmNlOiIsIGxlbmd0aCh3aGljaChjdW1zdW0odG90LnZhcikgPD0gOTUpKSkKCmBgYAoKIyBBZGQgY2x1c3RlciBJRHMgZnJvbSBTZXVyYXQgdjEKCkV4cG9ydGVkIGNlbGwgSURzIGZvciBjbHVzdGVycyAzLCAxNywgMTAsIDExIGZyb20gU2V1cmF0IHYxLiBXaWxsIGFkZCB0aGVzZSBJRHMgYXMgYSBtZXRhZGF0YSBjb2x1bW4uICAKQ3JlYXRlIGNvbHVtbiAiY2x1c3QuSUQiIGFuZCBwb3B1bGF0ZSB3aXRoIDAncy4gVGhlbiBpbXBvcnQgSURzIGZvciBjbHVzdGVycwoKCgpgYGB7cn0KY2x1c3QzLmNlbGxzIDwtIHJlYWQudGFibGUoZmlsZSA9ICIuLi9TZXVyYXR2MV9jbHVzdGVyQ2VsbElEcy9jbHVzdGVyM2NlbGxJRHMudHh0IiwgY29sLm5hbWVzID0gImNsdXN0MDMiKQpjbHVzdDMuY2VsbHMgPC0gc2FwcGx5KGNsdXN0My5jZWxscywgZnVuY3Rpb24oeCkgcGFzdGUwKGdzdWIoIkNNUCIsICJDTVBtMiIsIHgpLCAiLTEiKSkKY2x1c3QxNy5jZWxscyA8LSByZWFkLnRhYmxlKGZpbGUgPSAiLi4vU2V1cmF0djFfY2x1c3RlckNlbGxJRHMvY2x1c3RlcjE3Y2VsbElEcy50eHQiLCBjb2wubmFtZXMgPSAiY2x1c3QxNyIpCmNsdXN0MTcuY2VsbHMgPC0gc2FwcGx5KGNsdXN0MTcuY2VsbHMsIGZ1bmN0aW9uKHgpIHBhc3RlMChnc3ViKCJDTVAiLCAiQ01QbTIiLCB4KSwgIi0xIikpCmNsdXN0MTAuY2VsbHMgPC0gcmVhZC50YWJsZShmaWxlID0gIi4uL1NldXJhdHYxX2NsdXN0ZXJDZWxsSURzL2NsdXN0ZXIxMGNlbGxJRHMudHh0IiwgY29sLm5hbWVzID0gImNsdXN0MTAiKQpjbHVzdDEwLmNlbGxzIDwtIHNhcHBseShjbHVzdDEwLmNlbGxzLCBmdW5jdGlvbih4KSBwYXN0ZTAoZ3N1YigiQ01QIiwgIkNNUG0yIiwgeCksICItMSIpKQpjbHVzdDExLmNlbGxzIDwtIHJlYWQudGFibGUoZmlsZSA9ICIuLi9TZXVyYXR2MV9jbHVzdGVyQ2VsbElEcy9jbHVzdGVyMTFjZWxsSURzLnR4dCIsIGNvbC5uYW1lcyA9ICJjbHVzdDExIikKY2x1c3QxMS5jZWxscyA8LSBzYXBwbHkoY2x1c3QxMS5jZWxscywgZnVuY3Rpb24oeCkgcGFzdGUwKGdzdWIoIkNNUCIsICJDTVBtMiIsIHgpLCAiLTEiKSkKYGBgCgpBZGQgbmV3IG1ldGFkYXRhIGNvbHVtbgpgYGB7cn0KY21wLm9iamVjdEBtZXRhLmRhdGFbJ2NsdXN0LklEJ10gPC0gMApoZWFkKGNtcC5vYmplY3RAbWV0YS5kYXRhKQpgYGAKCm5vdyBtYXAgbmV3IGlkcwpgYGB7cn0KY21wLm9iamVjdEBtZXRhLmRhdGEkY2x1c3QuSURbcm93bmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpICVpbiUgY2x1c3QzLmNlbGxzXSA8LSAzCmNtcC5vYmplY3RAbWV0YS5kYXRhJGNsdXN0LklEW3Jvd25hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSAlaW4lIGNsdXN0MTcuY2VsbHNdIDwtIDE3CmNtcC5vYmplY3RAbWV0YS5kYXRhJGNsdXN0LklEW3Jvd25hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSAlaW4lIGNsdXN0MTAuY2VsbHNdIDwtIDEwCmNtcC5vYmplY3RAbWV0YS5kYXRhJGNsdXN0LklEW3Jvd25hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSAlaW4lIGNsdXN0MTEuY2VsbHNdIDwtIDExCmBgYAoKZG8gbnVtYmVycyBtYWtlIHNlbnNlPwpgYGB7cn0KbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YVtjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRCA9PSAxMCxdKQpucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhW2NtcC5vYmplY3RAbWV0YS5kYXRhJGNsdXN0LklEID09IDExLF0pCm5yb3coY21wLm9iamVjdEBtZXRhLmRhdGFbY21wLm9iamVjdEBtZXRhLmRhdGEkY2x1c3QuSUQgPT0gMTcsXSkKbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YVtjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRCA9PSAzLF0pCmBgYAoKIyMgSWRlbnRpZnkgdmFyaWFibGUgZ2VuZXMgZm9yIG5ldyBiaW9tYXJrCmBgYHtyfQpsZW5ndGgoY21wLm9iamVjdEBhc3NheXMkUk5BQHZhci5mZWF0dXJlcykKYGBgCmBgYHtyfQp0b3AxMDAudmFyIDwtIGNtcC5vYmplY3RAYXNzYXlzJFJOQUB2YXIuZmVhdHVyZXNbMToxMDBdCmxlbmd0aCh0b3AxMDAudmFyKQpgYGAKCgoKCgoKIyBUb3RhbCB2YXIgOTAlCiMjIE5laWdoYm9yaG9vZCBhbmQgdW1hcApzZXQgdG90YWwudmFyIDwtIDkwJQpgYGB7cn0KdG90LnZhciA8LSBwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYsIHBsb3QudmFyID0gRkFMU0UsIHJldHVybi52YWwgPSBUUlVFKQpuZGltcyA8LSBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDkwKSkKCmNtcC5vYmplY3QgPC0gRmluZE5laWdoYm9ycyhjbXAub2JqZWN0LCBkaW1zID0gMTpuZGltcykKY21wLm9iamVjdCA8LSBGaW5kQ2x1c3RlcnMoY21wLm9iamVjdCwgcmVzb2x1dGlvbiA9IDAuNSkKY21wLm9iamVjdCA8LSBSdW5VTUFQKGNtcC5vYmplY3QsIGRpbXMgPSAxOiBuZGltcykKCmBgYApQbG90IFVNQVAKCmBgYHtyfQpmb3IoeCBpbiBjKDAuNSwgMSwgMS41LCAyLCAyLjUpKXsKCWNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSB4KQp9CnNhdmVSRFMoY21wLm9iamVjdCwgZmlsZSA9IHBhc3RlMChwcm9qZWN0TmFtZSwgIl9kaW0iLCBuZGltcywgIi5SRFMiKSkKYGBgCgpgYGB7cn0KZm9yIChtZXRhLmNvbCBpbiBjb2xuYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkpewoJaWYoZ3JlcGwocGF0dGVybiA9ICgiUk5BX3Nubl9yZXMiKSwgeCA9IG1ldGEuY29sKT09VFJVRSl7CgkJbXlwbG90IDwtIERpbVBsb3QoY21wLm9iamVjdCwgCgkJCQkJCQkJCQkJZ3JvdXAuYnkgPSBtZXRhLmNvbCwKCQkJCQkJCQkJCQlyZWR1Y3Rpb24gPSAidW1hcCIsIAoJCQkJCQkJCQkJCWNvbHMgPSBjb2xvci5wYWxldHRlCgkJCQkJCQkJCQkJKSArIAoJCQlnZ3RpdGxlKHBhc3RlMChwcm9qZWN0TmFtZSwgIiBkaW0iLCBuZGltcywgInJlcyIsIGdzdWIoIlJOQV9zbm5fcmVzIiwgIiIsIG1ldGEuY29sKSApKQoJCXBsb3QobXlwbG90KQoJfQp9CmBgYAoKIyMjIENsdXN0cmVlCndoYXQncyB0aGUgbWF4IHJlc29sdXRpb24gd2UgY2FuIGFjaGlldmUgd2hpbGUga2VlcGlnbiBjbHVzdGVycyBzdGFibGU/CmBgYHtyIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNX0KcGxvdC50aXRsZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJfY2x1c3RyZWVfbmRpbSIsIG1heChjbXAub2JqZWN0QGNvbW1hbmRzJFJ1blVNQVAuUk5BLnBjYSRkaW1zKSkKbXkuY2x1c3RyZWUgPC0gY2x1c3RyZWUoY21wLm9iamVjdCwgcHJlZml4ID0gIlJOQV9zbm5fcmVzLiIsIG5vZGVfY29sb3VyID0gInNjM19zdGFiaWxpdHkiLCBleHBycyA9ICJzY2FsZS5kYXRhIikgKyAKCXNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobG93ID0gJ3JlZDMnLCBoaWdoID0gJ3doaXRlJykgKyAKCWdndGl0bGUocGxvdC50aXRsZSkKcG5nKGZpbGVuYW1lID0gcGFzdGUwKHBsb3QudGl0bGUsICIucG5nIiksIGhlaWdodCA9IDgwMCwgd2lkdGggPSAxNjAwKQpwbG90KG15LmNsdXN0cmVlKQpkZXYub2ZmKCkKCmBgYApJIHRoaW5rIEknbSBsaWtpbmcgcmVzLjEuMCBmcm9tIHRoaXMuIEFsdGhvdWdoIGhvdyBtdWNoIGRvZXMgdGhpcyBjaGFuZ2UgaWYgSSB1c2UgZmV3ZXIgUENzLi4uCgoKCmZvciBlYWNoIHJlc29sdXRpb24sIG51bWJlci9wZXJjZW50YWdlIG9mIGNlbGxzIGluIGVhY2ggY2x1c3Rlcj8KCmBgYHtyfQp0b3QuY2VsbHMgPC0gbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YSkKZm9yIChtZXRhLmNvbCBpbiBjb2xuYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkpewoJaWYoZ3JlcGwocGF0dGVybiA9ICgiUk5BX3Nubl9yZXMiKSwgeCA9IG1ldGEuY29sKT09VFJVRSl7CgkJbmV3LmNsdXN0ZXJzIDwtIHNvcnQoYXMubnVtZXJpYyhsZXZlbHMoY21wLm9iamVjdEBtZXRhLmRhdGFbW21ldGEuY29sXV0pKSkKCQlzdGF0cy5kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gMiwgbnJvdyA9IGxlbmd0aChuZXcuY2x1c3RlcnMpKSkKCQljb2xuYW1lcyhzdGF0cy5kZikgPC0gYygibnVtX2NlbGxzIiwgInBjdF9wb3AiKQoJCXJvd25hbWVzKHN0YXRzLmRmKSA8LSBuZXcuY2x1c3RlcnMKCQltZXRhLmRmIDwtIGNtcC5vYmplY3RAbWV0YS5kYXRhCgkJZm9yKHJvdy5pZCBpbiByb3duYW1lcyhzdGF0cy5kZikpewoJCQkJbnVtLnggPC0gbnJvdyhtZXRhLmRmW21ldGEuZGZbbWV0YS5jb2xdID09IHJvdy5pZCxdKQoJCQkJcGN0LnggPC0gYXMuaW50ZWdlcihudW0ueCAvIHRvdC5jZWxscyAqMTAwKQoJCQkJIyBwcmludChwY3QueCkKCQkJCXN0YXRzLmRmW3Jvdy5pZCwgIm51bV9jZWxscyJdIDwtIG51bS54CgkJCQlzdGF0cy5kZltyb3cuaWQsICJwY3RfcG9wIl0gPC0gcGN0LngKCQl9CgkJcHJpbnQoc3RhdHMuZGYpCgl9Cn0KYGBgCgoKCkZvciBlYWNoIHJlc29sdXRpb24sIHdoYXQgcGVyY2VudGFnZSBvZiBjZWxscyBpbiBlYWNoIGNsdXN0ZXIgYXJlIGVucmljaGVkIGZvciBvbmUgb2Ygb3VyIGNsdXN0LklEcz8KCgpUZXN0OiB3aGF0IHBlcmNlbnRhZ2Ugb2YgZWFjaCBuZXcgY2x1c3RlcklEIG1hdGNoZXMgb25lIG9mIHRoZSBvbGRlciBjbHVzdGVycz8KYGBge3J9CmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCW5ldy5jbHVzdGVycyA8LSBzb3J0KGFzLm51bWVyaWMobGV2ZWxzKGNtcC5vYmplY3RAbWV0YS5kYXRhW1ttZXRhLmNvbF1dKSkpCgkJZW5yaWNoLmRmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSA0LCBucm93ID0gbGVuZ3RoKG5ldy5jbHVzdGVycykpKQoJCWNvbG5hbWVzKGVucmljaC5kZikgPC0gYygzLCAxNywgMTAsIDExKQoJCXJvd25hbWVzKGVucmljaC5kZikgPC0gbmV3LmNsdXN0ZXJzCgkJbWV0YS5kZiA8LSBjbXAub2JqZWN0QG1ldGEuZGF0YQoJCWZvcihyb3cuaWQgaW4gcm93bmFtZXMoZW5yaWNoLmRmKSl7CgkJCXRvdC5jbHVzIDwtIG5yb3cobWV0YS5kZlttZXRhLmRmW1ttZXRhLmNvbF1dID09IHJvdy5pZCxdKQoJCQlmb3IoY29sLmlkIGluIGNvbG5hbWVzKGVucmljaC5kZikpewoJCQkJbnVtLnggPC0gbnJvdyhtZXRhLmRmWyhtZXRhLmRmW1ttZXRhLmNvbF1dID09IHJvdy5pZCkgJiAobWV0YS5kZiRjbHVzdC5JRCA9PSBjb2wuaWQpLF0pCgkJCQlwY3QueCA8LSBhcy5pbnRlZ2VyKG51bS54IC8gdG90LmNsdXMgKjEwMCkKCQkJCSMgcHJpbnQocGN0LngpCgkJCQllbnJpY2guZGZbcm93LmlkLCBjb2wuaWRdIDwtIHBjdC54CgkJCX0KCQl9CgkJY29sbmFtZXMoZW5yaWNoLmRmKSA8LSBzYXBwbHkoY29sbmFtZXMoZW5yaWNoLmRmKSwgZnVuY3Rpb24oeCkgcGFzdGUwKCJvbGRjbHVzdGVyIiwgeCkpCgkJcm93bmFtZXMoZW5yaWNoLmRmKSA8LSBzYXBwbHkocm93bmFtZXMoZW5yaWNoLmRmKSwgZnVuY3Rpb24oeCkgcGFzdGUwKCJuZXdjbHVzdGVyIiwgeCkpCgkJeGxzeDo6d3JpdGUueGxzeChlbnJpY2guZGYsIGZpbGUgPSBwYXN0ZTAoIlBjdE9mTmV3Q2x1c3RlcnNPdmVybGFwcGluZ09sZENsdXN0ZXJzXyIsIHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiLnhsc3giKSwgc2hlZXROYW1lID0gcGFzdGUwKGdzdWIoIlJOQV9zbm5fIiwgIiIsIG1ldGEuY29sKSksIGFwcGVuZCA9IFRSVUUpCgkJcHJpbnQoZW5yaWNoLmRmKQoJfQp9CgpgYGAKQWJzb2x1dGVseSB0ZXJyaWJsZSBvdmVybGFwLCBubyBlbnJpY2htZW50IG9mIGFueSBvZiB0aGVzZSBhY3Jvc3MgdGhlIG5ldyBjbHVzdGVyaW5nIGFsZ29yaXRobS4gTWF5YmUgc2hvdWxkIHRyeSA5NSUgdmFyaWF0aW9uIGNvdmVyZWQKCiMjIEZpbmQgb2xkIGNlbGxzIG9uIFVNQVAKCnRpbWUgZm9yIHRoZSBzdXBlciBzY2FyZXkgbW9tZW50IHRvIHNlZSBpZiB0aGUgY2VsbHMgZnJvbSBzZXVyYXR2MSBzdGlsbCBjbHVzdGVyIHRvZ2V0aGVyIG9uIGluIHNldXJhdCB2NAoKYGBge3IgZmlnLndpZHRoID0gNH0KRGltUGxvdChjbXAub2JqZWN0LAoJCQkJcmVkdWN0aW9uID0gInVtYXAiLAoJCQkJZ3JvdXAuYnkgPSAiY2x1c3QuSUQiLCAKCQkJCSMgc3BsaXQuYnkgPSAib3JpZy5pZGVudCIsCgkJCQljb2xzID0gYygiZ3JheSIsICJvcmFuZ2UiLCAiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iKSwpCmBgYApgYGB7ciBmaWcud2lkdGggPSA0fQpEaW1QbG90KGNtcC5vYmplY3QsCgkJCQlyZWR1Y3Rpb24gPSAidW1hcCIsCgkJCQlncm91cC5ieSA9ICJvcmlnLmlkZW50IiwgCgkJCQlzcGxpdC5ieSA9ICJjbHVzdC5JRCIsCgkJCQljb2xzID0gYygiZ3JheSIsICJvcmFuZ2UiLCAiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iKSwpCmBgYAoKCiMgVG90YWwgdmFyIDg1JQojIyBOZWlnaGJvcmhvb2QgYW5kIHVtYXAKc2V0IHRvdGFsLnZhciA8LSA4NSUKYGBge3J9CnRvdC52YXIgPC0gcGVyY2VudC52YXJpYW5jZShjbXAub2JqZWN0QHJlZHVjdGlvbnMkcGNhQHN0ZGV2LCBwbG90LnZhciA9IEZBTFNFLCByZXR1cm4udmFsID0gVFJVRSkKbmRpbXMgPC0gbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA4NSkpCgpjbXAub2JqZWN0IDwtIEZpbmROZWlnaGJvcnMoY21wLm9iamVjdCwgZGltcyA9IDE6bmRpbXMpCmNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSAwLjUpCmNtcC5vYmplY3QgPC0gUnVuVU1BUChjbXAub2JqZWN0LCBkaW1zID0gMTogbmRpbXMpCgpzYXZlUkRTKGNtcC5vYmplY3QsIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICIuUkRTIikpCmBgYApQbG90IFVNQVAKCmBgYHtyfQpmb3IoeCBpbiBjKDAuNSwgMSwgMS41LCAyLCAyLjUpKXsKCWNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSB4KQp9CmBgYAoKYGBge3J9CmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCW15cGxvdCA8LSBEaW1QbG90KGNtcC5vYmplY3QsIAoJCQkJCQkJCQkJCWdyb3VwLmJ5ID0gbWV0YS5jb2wsCgkJCQkJCQkJCQkJcmVkdWN0aW9uID0gInVtYXAiLCAKCQkJCQkJCQkJCQljb2xzID0gY29sb3IucGFsZXR0ZQoJCQkJCQkJCQkJCSkgKyAKCQkJZ2d0aXRsZShwYXN0ZTAocHJvamVjdE5hbWUsICIgZGltIiwgbmRpbXMsICJyZXMiLCBnc3ViKCJSTkFfc25uX3JlcyIsICIiLCBtZXRhLmNvbCkgKSkKCQlwbG90KG15cGxvdCkKCX0KfQpgYGAKCiMjIyBDbHVzdHJlZQp3aGF0J3MgdGhlIG1heCByZXNvbHV0aW9uIHdlIGNhbiBhY2hpZXZlIHdoaWxlIGtlZXBpZ24gY2x1c3RlcnMgc3RhYmxlPwpgYGB7ciBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDV9CnBsb3QudGl0bGUgPC0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2NsdXN0cmVlX25kaW0iLCBtYXgoY21wLm9iamVjdEBjb21tYW5kcyRSdW5VTUFQLlJOQS5wY2EkZGltcykpCm15LmNsdXN0cmVlIDwtIGNsdXN0cmVlKGNtcC5vYmplY3QsIHByZWZpeCA9ICJSTkFfc25uX3Jlcy4iLCBub2RlX2NvbG91ciA9ICJzYzNfc3RhYmlsaXR5IiwgZXhwcnMgPSAic2NhbGUuZGF0YSIpICsgCglzY2FsZV9jb2xvcl9jb250aW51b3VzKGxvdyA9ICdyZWQzJywgaGlnaCA9ICd3aGl0ZScpICsgCglnZ3RpdGxlKHBsb3QudGl0bGUpCnBuZyhmaWxlbmFtZSA9IHBhc3RlMChwbG90LnRpdGxlLCAiLnBuZyIpLCBoZWlnaHQgPSA4MDAsIHdpZHRoID0gMTYwMCkKcGxvdChteS5jbHVzdHJlZSkKZGV2Lm9mZigpCmBgYAoKCgpmb3IgZWFjaCByZXNvbHV0aW9uLCBudW1iZXIvcGVyY2VudGFnZSBvZiBjZWxscyBpbiBlYWNoIGNsdXN0ZXI/CgpgYGB7cn0KdG90LmNlbGxzIDwtIG5yb3coY21wLm9iamVjdEBtZXRhLmRhdGEpCmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCW5ldy5jbHVzdGVycyA8LSBzb3J0KGFzLm51bWVyaWMobGV2ZWxzKGNtcC5vYmplY3RAbWV0YS5kYXRhW1ttZXRhLmNvbF1dKSkpCgkJc3RhdHMuZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDIsIG5yb3cgPSBsZW5ndGgobmV3LmNsdXN0ZXJzKSkpCgkJY29sbmFtZXMoc3RhdHMuZGYpIDwtIGMoIm51bV9jZWxscyIsICJwY3RfcG9wIikKCQlyb3duYW1lcyhzdGF0cy5kZikgPC0gbmV3LmNsdXN0ZXJzCgkJbWV0YS5kZiA8LSBjbXAub2JqZWN0QG1ldGEuZGF0YQoJCWZvcihyb3cuaWQgaW4gcm93bmFtZXMoc3RhdHMuZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlttZXRhLmRmW21ldGEuY29sXSA9PSByb3cuaWQsXSkKCQkJCXBjdC54IDwtIGFzLmludGVnZXIobnVtLnggLyB0b3QuY2VsbHMgKjEwMCkKCQkJCSMgcHJpbnQocGN0LngpCgkJCQlzdGF0cy5kZltyb3cuaWQsICJudW1fY2VsbHMiXSA8LSBudW0ueAoJCQkJc3RhdHMuZGZbcm93LmlkLCAicGN0X3BvcCJdIDwtIHBjdC54CgkJfQoJCXByaW50KHN0YXRzLmRmKQoJfQp9CmBgYAoKCgpGb3IgZWFjaCByZXNvbHV0aW9uLCB3aGF0IHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyIGFyZSBlbnJpY2hlZCBmb3Igb25lIG9mIG91ciBjbHVzdC5JRHM/CgoKVGVzdDogd2hhdCBwZXJjZW50YWdlIG9mIGVhY2ggbmV3IGNsdXN0ZXJJRCBtYXRjaGVzIG9uZSBvZiB0aGUgb2xkZXIgY2x1c3RlcnM/CmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCWVucmljaC5kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNCwgbnJvdyA9IGxlbmd0aChuZXcuY2x1c3RlcnMpKSkKCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIGMoMywgMTcsIDEwLCAxMSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKGVucmljaC5kZikpewoJCQl0b3QuY2x1cyA8LSBucm93KG1ldGEuZGZbbWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQsXSkKCQkJZm9yKGNvbC5pZCBpbiBjb2xuYW1lcyhlbnJpY2guZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlsobWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQpICYgKG1ldGEuZGYkY2x1c3QuSUQgPT0gY29sLmlkKSxdKQoJCQkJcGN0LnggPC0gYXMuaW50ZWdlcihudW0ueCAvIHRvdC5jbHVzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJZW5yaWNoLmRmW3Jvdy5pZCwgY29sLmlkXSA8LSBwY3QueAoJCQl9CgkJfQoJCWNvbG5hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KGNvbG5hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgib2xkY2x1c3RlciIsIHgpKQoJCXJvd25hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KHJvd25hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgibmV3Y2x1c3RlciIsIHgpKQoJCXhsc3g6OndyaXRlLnhsc3goZW5yaWNoLmRmLCBmaWxlID0gcGFzdGUwKCJQY3RPZk5ld0NsdXN0ZXJzT3ZlcmxhcHBpbmdPbGRDbHVzdGVyc18iLCBwcm9qZWN0TmFtZSwgIl9kaW0iLCBuZGltcywgIi54bHN4IiksIHNoZWV0TmFtZSA9IHBhc3RlMChnc3ViKCJSTkFfc25uXyIsICIiLCBtZXRhLmNvbCkpLCBhcHBlbmQgPSBUUlVFKQoJCXByaW50KGVucmljaC5kZikKCX0KfQoKYGBgCkFic29sdXRlbHkgdGVycmlibGUgb3ZlcmxhcCwgbm8gZW5yaWNobWVudCBvZiBhbnkgb2YgdGhlc2UgYWNyb3NzIHRoZSBuZXcgY2x1c3RlcmluZyBhbGdvcml0aG0uIE1heWJlIHNob3VsZCB0cnkgOTUlIHZhcmlhdGlvbiBjb3ZlcmVkCgojIyBGaW5kIG9sZCBjZWxscyBvbiBVTUFQCgp0aW1lIGZvciB0aGUgc3VwZXIgc2NhcmV5IG1vbWVudCB0byBzZWUgaWYgdGhlIGNlbGxzIGZyb20gc2V1cmF0djEgc3RpbGwgY2x1c3RlciB0b2dldGhlciBvbiBpbiBzZXVyYXQgdjQKCmBgYHtyIGZpZy53aWR0aCA9IDR9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gImNsdXN0LklEIiwgCgkJCQkjIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKYGBge3IgZmlnLndpZHRoID0gNH0KRGltUGxvdChjbXAub2JqZWN0LAoJCQkJcmVkdWN0aW9uID0gInVtYXAiLAoJCQkJZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIAoJCQkJc3BsaXQuYnkgPSAiY2x1c3QuSUQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKCgoKIyBUb3RhbCB2YXIgOTUlCgojIyBOZWlnaGJvcmhvb2QgYW5kIHVtYXAKc2V0IHRvdGFsLnZhciA8LSA5NSUKYGBge3J9CnRvdC52YXIgPC0gcGVyY2VudC52YXJpYW5jZShjbXAub2JqZWN0QHJlZHVjdGlvbnMkcGNhQHN0ZGV2LCBwbG90LnZhciA9IEZBTFNFLCByZXR1cm4udmFsID0gVFJVRSkKbmRpbXMgPC0gbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA5NSkpCgpjbXAub2JqZWN0IDwtIEZpbmROZWlnaGJvcnMoY21wLm9iamVjdCwgZGltcyA9IDE6bmRpbXMpCmNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSAwLjUpCmNtcC5vYmplY3QgPC0gUnVuVU1BUChjbXAub2JqZWN0LCBkaW1zID0gMTogbmRpbXMpCgpzYXZlUkRTKGNtcC5vYmplY3QsIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICIuUkRTIikpCmBgYApQbG90IFVNQVAKCmBgYHtyfQpmb3IoeCBpbiBjKDAuNSwgMSwgMS41LCAyLCAyLjUpKXsKCWNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSB4KQp9CmBgYAoKYGBge3J9CmNtcC5vYmplY3QgPC0gcmVhZFJEUygiQ01QX2RpbTQxLlJEUyIpCmBgYAoKCmBgYHtyIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNX0KcGxvdC50aXRsZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJfY2x1c3RyZWVfbmRpbSIsIG1heChjbXAub2JqZWN0QGNvbW1hbmRzJFJ1blVNQVAuUk5BLnBjYSRkaW1zKSkKbXkuY2x1c3RyZWUgPC0gY2x1c3RyZWUoY21wLm9iamVjdCwgcHJlZml4ID0gIlJOQV9zbm5fcmVzLiIsIG5vZGVfY29sb3VyID0gInNjM19zdGFiaWxpdHkiLCBleHBycyA9ICJzY2FsZS5kYXRhIikgKyAKCXNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobG93ID0gJ3JlZDMnLCBoaWdoID0gJ3doaXRlJykgKyAKCWdndGl0bGUocGxvdC50aXRsZSkKcG5nKGZpbGVuYW1lID0gcGFzdGUwKHBsb3QudGl0bGUsICIucG5nIiksIGhlaWdodCA9IDgwMCwgd2lkdGggPSAxNjAwKQpwbG90KG15LmNsdXN0cmVlKQpkZXYub2ZmKCkKYGBgCgpGb3IgZWFjaCByZXNvbHV0aW9uLCB3aGF0IHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyIGFyZSBlbnJpY2hlZCBmb3Igb25lIG9mIG91ciBjbHVzdC5JRHM/CgoKVGVzdDogd2hhdCBwZXJjZW50YWdlIG9mIGVhY2ggbmV3IGNsdXN0ZXJJRCBtYXRjaGVzIG9uZSBvZiB0aGUgb2xkZXIgY2x1c3RlcnM/CmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCWVucmljaC5kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNCwgbnJvdyA9IGxlbmd0aChuZXcuY2x1c3RlcnMpKSkKCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIGMoMywgMTcsIDEwLCAxMSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKGVucmljaC5kZikpewoJCQl0b3QuY2x1cyA8LSBucm93KG1ldGEuZGZbbWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQsXSkKCQkJZm9yKGNvbC5pZCBpbiBjb2xuYW1lcyhlbnJpY2guZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlsobWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQpICYgKG1ldGEuZGYkY2x1c3QuSUQgPT0gY29sLmlkKSxdKQoJCQkJcGN0LnggPC0gYXMuaW50ZWdlcihudW0ueCAvIHRvdC5jbHVzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJZW5yaWNoLmRmW3Jvdy5pZCwgY29sLmlkXSA8LSBwY3QueAoJCQl9CgkJfQoJCWNvbG5hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KGNvbG5hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgib2xkY2x1c3RlciIsIHgpKQoJCXJvd25hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KHJvd25hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgibmV3Y2x1c3RlciIsIHgpKQoJCXhsc3g6OndyaXRlLnhsc3goZW5yaWNoLmRmLCBmaWxlID0gcGFzdGUwKCJQY3RPZk5ld0NsdXN0ZXJzT3ZlcmxhcHBpbmdPbGRDbHVzdGVyc18iLCBwcm9qZWN0TmFtZSwgIl9kaW0iLCBuZGltcywgIi54bHN4IiksIHNoZWV0TmFtZSA9IHBhc3RlMChnc3ViKCJSTkFfc25uXyIsICIiLCBtZXRhLmNvbCkpLCBhcHBlbmQgPSBUUlVFKQoJCXByaW50KGVucmljaC5kZikKCX0KfQoKYGBgCkFic29sdXRlbHkgdGVycmlibGUgb3ZlcmxhcCwgbm8gZW5yaWNobWVudCBvZiBhbnkgb2YgdGhlc2UgYWNyb3NzIHRoZSBuZXcgY2x1c3RlcmluZyBhbGdvcml0aG0uIE1heWJlIHNob3VsZCB0cnkgOTUlIHZhcmlhdGlvbiBjb3ZlcmVkCgojIyBGaW5kIG9sZCBjZWxscyBvbiBVTUFQCgp0aW1lIGZvciB0aGUgc3VwZXIgc2NhcmV5IG1vbWVudCB0byBzZWUgaWYgdGhlIGNlbGxzIGZyb20gc2V1cmF0djEgc3RpbGwgY2x1c3RlciB0b2dldGhlciBvbiBpbiBzZXVyYXQgdjQKCmBgYHtyIGZpZy53aWR0aCA9IDJ9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gImNsdXN0LklEIiwgCgkJCQlwdC5zaXplID0gLjEsCgkJCQkjIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKYGBge3IgZmlnLndpZHRoID0gNH0KRGltUGxvdChjbXAub2JqZWN0LAoJCQkJcmVkdWN0aW9uID0gInVtYXAiLAoJCQkJZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIAoJCQkJc3BsaXQuYnkgPSAiY2x1c3QuSUQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKCgoKIyMjIEdlbmUgZXhwcmVzc2lvbiBvZiBvbGQgY2x1c3RycyBvbiBuZXcgbWFwCkxldCdzIHNlZSBpZiB3ZSBjYW4gZ2V0IHNvbWUgZ2VuZSBleHByZXNzaW9uIHByb2ZpbGVzIG9uIHRoZXNlLi4uCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTh9CmdlbmUubGlzdCA8LSBjKCJHYXRhMSIsICJHYXRhMiIsICJQZjQiLCAiRG50dCIsICJNcG8iLCAiTWVpczEiLCAiSXJmOCIsICJFbGFuZSIsICJGbGkxIiwgIlpmcG0xIikKVmxuUGxvdChjbXAub2JqZWN0LCBmZWF0dXJlcyA9IGdlbmUubGlzdCwgZ3JvdXAuYnkgPSAiY2x1c3QuSUQiLCBwdC5zaXplID0gMC4wMSwgY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIikpCmBgYAoKClVzZWQgdGhlIGV4Y2UgZG9jIHRvIGRvIHNvbWUgZmFuY3kgY29uZGl0aW9uYWwgZm9ybWF0dGluZy4gT2xkIGNsdXN0ZXIgMTcgaXMgcHJldHR5IGRpc3BlcnNlZCB1bnRpbCB5b3UgaXQgcmVzb2x1dGlvbiAyLjUuIE90aGVyaXNlLCBjZWxscyBpbiBvbGQgY2x1c3RlciAxNyBkbyBub3QgY29uc3RpdHV0ZSBtb3JlIHRoYW4gNDAlIG9mIGFueSBjZWxscyBpbiB0aGUgbmV3IGNsdXN0ZXJzLiAgCkFzIGZhciBhcyBJIGNhbiBzZWUsIHRoZSB0d28gYXBwcm9hY2hlcyBhcmUgdG8gZG8gREdFb2YgbmV3IENNUCB3LyByZXNvbHV0aW9uID0gMi41LCBBTkQvT1IgZG8gREdlIHVzaW5nIG9sZGVyIGNsdXN0ZXIgSURzLiBTdXJlIHNlZW1zIHRvIG1ha2Ugc2Vuc2UgdG8gZG8gYm90aC4uLgoKCiMgREdFIHcvIHJlc29sdXRpb24gPSAyLjUKU3RydCB3aXRoIGNvbXBhcmluZyBhbGwgY2x1c3RlcnMgYWdhaW5zdCBhbGwgb3RoZXIgY2x1c3RlcnMKV3JpdGUgb3V0IGNsdXN0ZXIgaW5mbwoKCmNhbGN1bGF0ZSBgRmluZEFsbE1hcmtlcnMoKWAgZm9yIGRpZmZlcmVudCBpZGVudHMgYW5kIHNhdmUgdG8gbmV3IGZpbGUKYGBge3J9CmlkZW50Lmxpc3QgPC0gYygiUk5BX3Nubl9yZXMuMC41IiwgIlJOQV9zbm5fcmVzLjEiLCAiUk5BX3Nubl9yZXMuMS41IiwgIlJOQV9zbm5fcmVzLjIiLCAiUk5BX3Nubl9yZXMuMi41IiwgImNsdXN0LklEIikKZm9yKHRlc3RlZC5pZGVudCBpbiBpZGVudC5saXN0KXsKCUlkZW50cyhjbXAub2JqZWN0KSA8LSB0ZXN0ZWQuaWRlbnQKCWFsbC5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNtcC5vYmplY3QpCgl4bHN4Ojp3cml0ZS54bHN4KHggPSBhbGwubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiLCAiY2x1c3RlciIsICJnZW5lIildLCAKCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZEFMTE1hcmtlcnNfcmVzMi41Lnhsc3giKSwgCgkJCQkJCQkJCSBzaGVldE5hbWUgPSB0ZXN0ZWQuaWRlbnQsIAoJCQkJCQkJCQkgY29sLm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSByb3cubmFtZXMgPSBGQUxTRSwgCgkJCQkJCQkJCSBhcHBlbmQgPSBUUlVFKQp9CmBgYAoKQ3JlYXRlIGBGaW5kQWxsTWFya2VycygpYCBsaXN0cyBmb3IgR1NFQQpgYGB7ciB9CklkZW50cyhjbXAub2JqZWN0KSA8LSAiUk5BX3Nubl9yZXMuMi41IgpyZXMuMi41LmFsbG1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoY21wLm9iamVjdCkKYGBgCgojIyBNYXAgSEdOQyBzeW1ib2xzCmBgYHtyfQpNb3VzZTJIdW1hblRhYmxlIDwtIE1vdXNlMkh1bWFuKHJlcy4yLjUuYWxsbWFya2VycyRnZW5lKQoKSEdOQyA8LSB3aXRoKE1vdXNlMkh1bWFuVGFibGUsIE1vdXNlMkh1bWFuVGFibGUkSEdOQ1ttYXRjaChyZXMuMi41LmFsbG1hcmtlcnMkZ2VuZSwgTW91c2UySHVtYW5UYWJsZSRNR0kpXSkKaGVhZChyZXMuMi41LmFsbG1hcmtlcnMpCnJlcy4yLjUuYWxsbWFya2VycyRIR05DIDwtIEhHTkMKdGFpbChyZXMuMi41LmFsbG1hcmtlcnMpCnNpZy5yZXMuMi41IDwtIHJlcy4yLjUuYWxsbWFya2Vyc1tyZXMuMi41LmFsbG1hcmtlcnMkcF92YWxfYWRqIDw9IDAuMDUsIF0Kc2lnLnJlcy4yLjUgPC0gc2lnLnJlcy4yLjVbYygiYXZnX2xvZzJGQyIsICJIR05DIiwgImNsdXN0ZXIiKV0Kc2lnLnJlcy4yLjUgPC0gc2lnLnJlcy4yLjVbIShzaWcucmVzLjIuNSRIR05DID09ICIiIHwgaXMubmEoc2lnLnJlcy4yLjUkSEdOQykpLF0gIyBHU0VBIHdpbGwgZmFpbCBpZiB0aGVyZSBhcmUgYW55IGJsYW5rcyBvciBOQXMgaW4gdGhlIHRhYmxlCnNpZy5yZXMuMi41IDwtIHNpZy5yZXMuMi41W10KCmBgYAoKCmBgYHtyfQpmb3IoY2x1c3RlciBpbiB1bmlxdWUoc2lnLnJlcy4yLjUkY2x1c3RlcikpewoJcHJpbnQocGFzdGUoIndyaXRpbmcgY2x1c3RlciIsIGNsdXN0ZXIpKQoJbmV3LnRhYmxlIDwtIHNpZy5yZXMuMi41W3NpZy5yZXMuMi41JGNsdXN0ZXIgPT0gY2x1c3RlciwgYygiSEdOQyIsICJhdmdfbG9nMkZDIildCgluZXcudGFibGUgPC0gbmV3LnRhYmxlW29yZGVyKC1uZXcudGFibGUkYXZnX2xvZzJGQyksIF0KCXdyaXRlLnRhYmxlKG5ldy50YWJsZSwgZmlsZSA9IHBhc3RlMCgiUmFua0xpc3RfcmVzMi41X2ZpbmRBbGxfaGduYy9yZXMuMi41Y2x1c3RlciIsIGNsdXN0ZXIsICIucm5rIiksIHF1b3RlID0gRkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLCBzZXAgPSAiXHQiLCApCgkKfQpgYGAKCgoKY2FsY3VsYXRlIGBGaW5kTWFya2VycygpYCB0aGF0IGRpc3Rpbmd1aXNoIGVhY2ggY2x1c3RlciAobWlnaHQgb3ZlcmxhYiBiZXR3ZWVuIGNsdXN0ZXJzKQpgYGB7cn0KaWRlbnQubGlzdCA8LSBjKCJSTkFfc25uX3Jlcy4wLjUiLCAiUk5BX3Nubl9yZXMuMSIsICJSTkFfc25uX3Jlcy4xLjUiLCAiUk5BX3Nubl9yZXMuMiIsICJSTkFfc25uX3Jlcy4yLjUiLCAiY2x1c3QuSUQiKQpmb3IodGVzdGVkLmlkZW50IGluIGlkZW50Lmxpc3QpewoJb2JqZWN0LmNvcHkgPC0gY21wLm9iamVjdAoJSWRlbnRzKG9iamVjdC5jb3B5KSA8LSB0ZXN0ZWQuaWRlbnQKCXByaW50KHBhc3RlKCJ0ZXN0aW5nIiwgdGVzdGVkLmlkZW50KSkKCWZvciAoY2x1c3RlciBpbiBzb3J0KGFzLm51bWVyaWMobGV2ZWxzKG9iamVjdC5jb3B5QG1ldGEuZGF0YVtbdGVzdGVkLmlkZW50XV0pKSkpewoJCXByaW50KHBhc3RlKCJsb29raW5nIGF0IGNsdXN0ZXIiLCBjbHVzdGVyKSkKCQljbHVzdGVyLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0LmNvcHksIGlkZW50LjEgPSBjbHVzdGVyKQoJCXRyeSgKCQkJeGxzeDo6d3JpdGUueGxzeCh4ID0gY2x1c3Rlci5tYXJrZXJzWyxjKCJhdmdfbG9nMkZDIiwgInBfdmFsX2FkaiIpXSwgCgkJCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZE1hcmtlcnNfIiwgZ3N1YigiUk5BX3Nubl8iLCAiIiwgdGVzdGVkLmlkZW50KSwgIi54bHN4IiksIAoJCQkJCQkJCQkJCSBzaGVldE5hbWUgPSBwYXN0ZTAoImNsc3QiLCBjbHVzdGVyKSwgCgkJCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkJCSByb3cubmFtZXMgPSBUUlVFLCAKCQkJCQkJCQkJCQkgYXBwZW5kID0gVFJVRSkKCQkpCQoJfQoJcmVtb3ZlKG9iamVjdC5jb3B5KQp9CmBgYAoKCgpgYGB7cn0KZm9yIChjbHVzdGVyIGluIHNvcnQoYXMubnVtZXJpYyhsZXZlbHMoY21wLm9iamVjdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMi41KSkpKXsKCWNsdXN0ZXIubWFya2VycyA8LSBGaW5kTWFya2VycyhjbXAub2JqZWN0LCBpZGVudC4xID0gY2x1c3RlcikKCXhsc3g6OndyaXRlLnhsc3goeCA9IGNsdXN0ZXIubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiKV0sIAoJCQkJCQkJCQkgZmlsZSA9IHBhc3RlMChwcm9qZWN0TmFtZSwgIl9GaW5kTWFya2Vyc19yZXMyLjUueGxzeCIpLCAKCQkJCQkJCQkJIHNoZWV0TmFtZSA9IHBhc3RlMCgiY2xzdCIsIGNsdXN0ZXIpLCAKCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkgcm93Lm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSBhcHBlbmQgPSBUUlVFKQp9CmBgYAoKIyMgQ29tYmluZSBjbHVzdGVycyB0aGF0IG1pZ2h0IHJlcHJlc2VudCBvbGQgY2x1c3RlciBpZHMKCiMgREdFIHcvIG1ldGFkYXRhIGFnYWluc3QgY2x1c3QuSUQgYWdhaW5zdCAiMCIKcmVzZXQgaWRlbnQgYXMgImNsdXN0LklEIiBhbmQgcmVydW4gYEZpbmRBbGxNYXJrZXJzKClgCmBgYHtyfQoJSWRlbnRzKGNtcC5vYmplY3QpIDwtICJjbHVzdC5JRCIKCWFsbC5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNtcC5vYmplY3QpCgl4bHN4Ojp3cml0ZS54bHN4KHggPSBhbGwubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiLCAiY2x1c3RlciIsICJnZW5lIildLCAKCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZEFMTE1hcmtlcnNfY2x1c3RJRC54bHN4IiksIAoJCQkJCQkJCQkgc2hlZXROYW1lID0gImNsdXN0SUQiLCAKCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkgcm93Lm5hbWVzID0gRkFMU0UsIAoJCQkJCQkJCQkgYXBwZW5kID0gVFJVRSkKYGBgCgoKYGBge3J9CiMgSWRlbnRzKGNtcC5vYmplY3QpIDwtICJjbHVzdC5JRCIKZm9yIChjbHVzdGVyIGluIHVuaXF1ZShjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRCkpewoJcHJpbnQoY2x1c3RlcikKCWNsdXN0ZXIubWFya2VycyA8LSBGaW5kTWFya2VycyhjbXAub2JqZWN0LCBpZGVudC4xID0gY2x1c3RlcikKCXhsc3g6OndyaXRlLnhsc3goeCA9IGNsdXN0ZXIubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiKV0sIAoJCQkJCQkJCQkgZmlsZSA9IHBhc3RlMChwcm9qZWN0TmFtZSwgIl9GaW5kTWFya2Vyc19jbHVzdElELnhsc3giKSwgCgkJCQkJCQkJCSBzaGVldE5hbWUgPSBwYXN0ZTAoIm9sZGNsdXN0IiwgY2x1c3RlciksIAoJCQkJCQkJCQkgY29sLm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSByb3cubmFtZXMgPSBUUlVFLCAKCQkJCQkJCQkJIGFwcGVuZCA9IFRSVUUpCn0KCmBgYAoKCiMgRGlzdGluZ3Vpc2hpbmcgZmVhdHVyZXMgb2YgY2x1c3RlcnMKUHJldmlvdXNseSBkZWZpbmVkIGJpb21hcmsgZ2VuZXMgYmFzZWQgb24gUEMgY29udHJpYnV0aW9ucy4gT3JpZ2luYWwgbGlzdCB3YXMgYmFzZWQgb24gKmFsbCogbXNBZ2dyLCBidXQgbGV0J3Mgc2VlIGhvdyBDTVAgc3Vic2V0IGRvZXM/CmBgYHtyIGZpZy5oZWlnaHQgPSAzMCwgZmlnLndpZHRoPTZ9ClZpekRpbUxvYWRpbmdzKGNtcC5vYmplY3QsIGRpbXMgPSAxOjEwLCBuZmVhdHVyZXMgPSAzMCwgcmVkdWN0aW9uID0gInBjYSIsIG5jb2wgPSAyKQpgYGAKCmBgYHtyfQpwY2EuZGYgPC0gY21wLm9iamVjdFtbInBjYSJdXQpwY2EuZGYgPC0gYXMuZGF0YS5mcmFtZShhcy5tYXRyaXgoc2xvdChvYmplY3QgPSBwY2EuZGYsIG5hbWUgPSAiZmVhdHVyZS5sb2FkaW5ncyIpKSkKcHJpbnQoY21wLm9iamVjdFtbInBjYSJdXSwgZGltcyA9IDIsIG5mZWF0dXJlcyA9IDUpCnJvd25hbWVzKHBjYS5kZltwY2EuZGYkUENfMiAlaW4lIHNvcnQocGNhLmRmJFBDXzIsIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjVdLCBdKQpyb3duYW1lcyhwY2EuZGZbcGNhLmRmJFBDXzIgJWluJSBzb3J0KHBjYS5kZiRQQ18yKVsxOjVdLCBdKQpgYGAKCm5vdyB3ZSBjYW4gZ2V0IGEgbGlzdCBvZiBwcmluY2lwYWwgY29tcG9uZW50cyEgIApmaXJzdCBwdWxsIHRoZSBsaXN0IG9mIG9sZEFuYWx5c2lzIENNUCB0b3AgUEMgZ2VuZXMKYGBge3J9CmNtcC5iaW9tYXJrIDwtIHJlYWQudGFibGUoZmlsZSA9ICIvVXNlcnMvaGV1c3RvbmVmL0Rlc2t0b3AvQ01QU3VicG9wcy9CaW9NYXJrL1Byb2JlUGFuZWxzL0NNUF9QQ1RvcEdlbmVzLnR4dCIsIHNlcCA9ICJcdCIsIGhlYWRlciA9IFRSVUUpCmJpb21hcmsuY21wdGFyZ2V0cyA8LSBjKCkKZm9yKGRmLmNvbCBpbiAxOm5jb2woY21wLmJpb21hcmspKXsKCWJpb21hcmsuY21wdGFyZ2V0cyA8LSBjKGJpb21hcmsuY21wdGFyZ2V0cywgYmlvbWFya1ssZGYuY29sXSkKfQpwcmludChjb2xuYW1lcyhiaW9tYXJrKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKGJpb21hcmsuY21wdGFyZ2V0cykpKQpgYGAKCk5vdyBnZXQgdGhlIGxpc3Qgb2YgY3VycmVudCBwYyBnZW5lIHRyZ2V0cyAob2xkQW5hbHlzaXMgdXNlZCBuZGltID0gMTo2LCBzbyB3ZSdsbCBzdGFydCB3aXRoIHRoYXQgcmFuZ2UpCmBgYHtyfQpwYy5saXN0IDwtIGMoIlBDXzEiLCAiUENfMiIsICJQQ18zIiwgIlBDXzQiLCAiUENfNSIsICJQQ182IikKcGMuZ2VuZXMgPC0gbGFwcGx5KHBjLmxpc3QsIGZ1bmN0aW9uKHgpIHJvd25hbWVzKHBjYS5kZltwY2EuZGZbW3hdXSAlaW4lIHNvcnQocGNhLmRmW1t4XV0sIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjMwXSxdKSkgI3RhcmdldGluZyByb3VnaGx5IDE4MCBnZW5lcyBsaWtlIGluIGJpb21hcmsuY21wdGFyZ2V0cwpwYy5nZW5lcyA8LSB1bmlxdWUodW5saXN0KHBjLmdlbmVzKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKHBjLmdlbmVzKSkpCmBgYAoKTm93IGNvbXBhcmUgdGhlIGxpc3RzLCBJIGd1ZXNzOgoKYGBge3J9CiMgc2V0ZGlmZih4LHkpIGdpdmVzIHlvdSB0aGluZ3MgaW4geCBub3QgaW4geS4gc2V0ZGlmZih5LHgpIGdpdmVzIHlvdSB0aGluZ3MgaW4geSBub3QgaW4geApzZXRkaWZmKGJpb21hcmsuY21wdGFyZ2V0cywgcGMuZ2VuZXMpCiMgcHJpbnQocGFzdGUoIlxuIGxlbmd0aDoiLCBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLmNtcHRhcmdldHMsIHBjLmdlbmVzKSkpKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBwYy5nZW5lcykpKSkKYGBgClVtbSwgeWVhaCB0aGF0IHdlbnQga2luZGEgaG93IEkgZXhwZWN0ZWQuIExldCdzIGRvIHRoaXMgYWdhaW4sIGJ1dCBmb3IgdGhlIGFjdHVhbCBiaW9tYXJrIGdlbmUgbGlzdHMuCmBgYHtyfQpiaW9tYXJrIDwtIHJlYWQudGFibGUoZmlsZSA9ICIvVXNlcnMvaGV1c3RvbmVmL0Rlc2t0b3AvQ01QU3VicG9wcy9CaW9NYXJrL1Byb2JlUGFuZWxzL0Jpb21hcmtQcm9iZUxpc3QudHh0Iiwgc2VwID0gIlx0IikKYmlvbWFyayA8LSBiaW9tYXJrWywxXQpzZXRkaWZmKGJpb21hcmssIHBjLmdlbmVzKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyaywgcGMuZ2VuZXMpKSkpCmBgYAoKCldoYXQgaWYgd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBwY3MgYnV0IGRlY3JlYXNlIHRoZSBkZXB0aCBvZiBlYWNoPyBUaGlzIG1pZ2h0IGNvdmVyIG1vcmUgb2YgYGJpb21hcmsJYCwgd2hpY2ggd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIHVzaW5nIG1zQWdnciBpbnN0ZWFkIG9mIG9ubHkgdGhlIENNUCBzdWJzZXQKYGBge3J9CnBjLmxpc3QgPC0gYygiUENfMSIsICJQQ18yIiwgIlBDXzMiLCAiUENfNCIsICJQQ181IiwgIlBDXzYiLCAiUENfNyIsICJQQ184IiwgIlBDXzkiLCAiUENfMTAiKQpwYy5nZW5lcyA8LSBsYXBwbHkocGMubGlzdCwgZnVuY3Rpb24oeCkgcm93bmFtZXMocGNhLmRmW3BjYS5kZltbeF1dICVpbiUgc29ydChwY2EuZGZbW3hdXSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6MjBdLF0pKQpwYy5nZW5lcyA8LSB1bmlxdWUodW5saXN0KHBjLmdlbmVzKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKHBjLmdlbmVzKSkpCgpgYGAKYGBge3J9CnNldGRpZmYoYmlvbWFyaywgcGMuZ2VuZXMpCndyaXRlTGluZXMoYygiIiwgImxlbmd0aDoiLCBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLCBwYy5nZW5lcykpKSkKYGBgCgpGb3IgY29tcGFyaXNvbiwgbGV0J3MganVzdCBzZWUgaG93IG1hbnkgb2YgYGJpb21hcmsuY21wdGFyZ2V0c2Agd2VyZSBhY3R1YWxseSBpbmNsdWRlZCBpbiBgYmlvbWFya2AKYGBge3J9CnNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBiaW9tYXJrKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBwYy5nZW5lcykpKSkKYGBgCmBgYHtyfQpsZW5ndGgoYmlvbWFyaykgLSBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLCBiaW9tYXJrLmNtcHRhcmdldHMpKQpgYGAKYGBge3J9Cmxlbmd0aChiaW9tYXJrKSAtIGxlbmd0aChzZXRkaWZmKGJpb21hcmssIHBjLmdlbmVzKSkKYGBgClNvIHdoZW4geW91IGxvb2sgYXQgaXQgbGlrZSB0aGF0LCBpdCdzIG5vdCBhY3R1YWxseSB0aGF0IGZhciBvZmYuCgoKV2hhdCBhcmUgdGhlIHNpbWlsYXJpdGllcz86CmBgYHtyfQpzZXRkaWZmKHNldGRpZmYoYmlvbWFyaywgYmlvbWFyay5jbXB0YXJnZXRzKSwgc2V0ZGlmZihiaW9tYXJrLCBwYy5nZW5lcykpCmBgYApUaGVzZSBhcmUgZ2VuZXMgZnJvbSB0aGUgOTdwcm9iZXMgbm90IGluIHRoZSBvbGQgQ01QIHNldCB0aGF0IGFyZSBhbHNvIG5vdCBpbiB0aGUgbmV3IENNUCBzZXQuIE90aGVyIHRoYW4gSXRnYTJiICh3aGljaCBpcyBhIGZhaWxlZCBwcm9iZSBhbnl3YXkpLCBub3RoaW5nIHNjcmVhbXMuIEFsc28gd2UnZCBoYXZlIHRocm93biBGbHQzIGFuZCBDZDM0IGZvciBpbiBhbnl3YXkgYmVjYXVzZSB0aGV5J3JlIHJlcXVpc2l0ZSBjZWxsIHN1cmZhY2UgbWFya2VycyAoYWxzbyBGbHQzIHN1cmZhY2UgbWFya2VyIGlzIGV4cGVuc2l2ZSBidXQgb3RoZXJ3aXNlIG5vdCBub3Rld29ydGh5IGFuZCBub3QgdXNlZCBpbiB0aGUgY3VycmVudCBzb3J0aW5nIHN0cmF0ZWd5KQoKV2hhdCBhYm91dCBjZWxsIHN1cmZhY2UgbWFya2VyIGV4cHJlc3Npb24/CiogQ2QzNAoqIENkMTYvMzIKKiBDZDkKKiBDZDQxCiogQ2Q0OAoqIFNjYTEgKGp1c3QgdGhyb3cgdGhhdCBpbiBmb3Igc2gqJnMgYW5kIGdpZ2dsZXMpCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTUsIGZpZy53aWR0aD0xMH0Kc3VyZmFjZS5tYXJrZXJzIDwtIGMoIkNkMzQiLCAiRmNncjMiLCAiRmNncjJiIiwgIkNkOSIsICJJdGdhMmIiLCAiQ2Q0OCIsICJMeTZhIikKRmVhdHVyZVBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBzdXJmYWNlLm1hcmtlcnMsIHB0LnNpemUgPSAxLCBzcGxpdC5ieSA9ICJjbHVzdC5JRCIsIG5jb2wgPSAxKQpgYGAKU2F2ZSBhcyBwbmcKYGBge3J9CnBuZyhmaWxlbmFtZSA9ICJGZWF0dXJlUGxvdF9DTVBfc3VyZmFjZU1hcmtlcnNfY2x1c3RJRGZhY2V0LnBuZyIsIGhlaWdodCA9IDE2MDAsIHdpZHRoID0gMTYwMCkKRmVhdHVyZVBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBzdXJmYWNlLm1hcmtlcnMsIHB0LnNpemUgPSAxLCBzcGxpdC5ieSA9ICJjbHVzdC5JRCIsIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCgoKCgoKCgojIENvbXBhcmUgQGcgaGllcmFyY2hjaWFsIGNsdXN0ZWlybmcKCkRvIGNsdXN0ZXJpbmcgdXNpbmcgYmlvbWFyayBSTkFzIGFzIGlucHV0CmBgYHtyfQojIFJlYWQgaW4gQmlvbWFya1JOQXMKYmlvbWFyay5ybmFzIDwtIHJlYWQudGFibGUoJy9Vc2Vycy9oZXVzdG9uZWYvRGVza3RvcC8xMFhHZW5vbWljc0RhdGEvQmlvbWFya1JOQXMudHh0JykKYmlvbWFyay5ybmFzIDwtIGJpb21hcmsucm5hcyRWMQpgYGAKCnVzZSBiaW9tYXJrIFJOQXMgdG8gZGVmaW5lIGRpbWVuc2lvbmFsIHJlZHVjdGlvbgpgYGB7cn0KY21wLm9iamVjdCA8LSByZWFkUkRTKCJDTVBfcmF3LlJEUyIpCmNtcC5vYmplY3QgPC0gUnVuUENBKGNtcC5vYmplY3QsIGZlYXR1cmVzID0gYmlvbWFyay5ybmFzLCBuZGltcy5wcmludCA9IDE6NSwgLCBuZmVhdHVyZXMucHJpbnQgPSA1KQpFbGJvd1Bsb3QoY21wLm9iamVjdCwgbmRpbXMgPSA1MCkKYGBgCgoKTm93IHJ1biB0aGUgY2x1c3RlcmluZwpgYGB7cn0KdG90LnZhciA8LSBwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYsIHBsb3QudmFyID0gRkFMU0UsIHJldHVybi52YWwgPSBUUlVFKQpuZGltcyA8LSBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDkwKSkKCmNtcC5vYmplY3QgPC0gRmluZE5laWdoYm9ycyhjbXAub2JqZWN0LCBkaW1zID0gMTpuZGltcykKY21wLm9iamVjdCA8LSBGaW5kQ2x1c3RlcnMoY21wLm9iamVjdCwgcmVzb2x1dGlvbiA9IDAuNSkKY21wLm9iamVjdCA8LSBSdW5VTUFQKGNtcC5vYmplY3QsIGRpbXMgPSAxOiBuZGltcykKCgpgYGAKCmZpbmQgdGhlIGNsdXN0ZXJzCgpgYGB7cn0KZm9yKHggaW4gYygwLjUsIDEsIDEuNSwgMiwgMi41KSl7CgljbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0geCkKfQpgYGAKClBsb3QgdGhlIHVtYXBzIGFuZCBjZWxsIGNsdXN0ZXIgaWRzCmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQlteXBsb3QgPC0gRGltUGxvdChjbXAub2JqZWN0LCAKCQkJCQkJCQkJCQlncm91cC5ieSA9IG1ldGEuY29sLAoJCQkJCQkJCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwgCgkJCQkJCQkJCQkJY29scyA9IGNvbG9yLnBhbGV0dGUKCQkJCQkJCQkJCQkpICsgCgkJCWdndGl0bGUocGFzdGUwKHByb2plY3ROYW1lLCAiIGRpbSIsIG5kaW1zLCAicmVzIiwgZ3N1YigiUk5BX3Nubl9yZXMiLCAiIiwgbWV0YS5jb2wpICkpCgkJcGxvdChteXBsb3QpCgl9Cn0KYGBgCiMjIyBDYWxjdWxhdGUgYW50aWNpcGF0ZWQgbnVtYmVyIG9mIGNlbGxzIHlvdSdsbCBmaW5kIGluIGVhY2ggYmlvbWFyayBjbHVzdGVyCkdldCAjIGNlbGxzIGluIGVhY2ggY2x1c3RlcgoKYGBge3J9CnRvdC5jZWxsY291bnQgPC0gbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YSkKcmVzMDUubGlzdCA8LSBzb3J0KHVuaXF1ZShjbXAub2JqZWN0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUpLCBkZWNyZWFzaW5nID0gRkFMU0UpCnNhcHBseShyZXMwNS5saXN0LCAKCQkJIGZ1bmN0aW9uKHgpewoJCQkgCXByaW50KAoJCQkgCQlwYXN0ZSgKCQkJIAkJCSJjbHVzdGVyIiwgeCwgIj0iLCAKCQkJIAkJCW5yb3coY21wLm9iamVjdEBtZXRhLmRhdGFbY21wLm9iamVjdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMC41ID09IHgsXSksIAoJCQkgCQkJImNlbGxzIG9yIiwgCgkJCSAJCQlyb3VuZChucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhW2NtcC5vYmplY3RAbWV0YS5kYXRhJFJOQV9zbm5fcmVzLjAuNSA9PSB4LF0pL3RvdC5jZWxsY291bnQqMTAwLCBkaWdpdHMgPSAyKSwgCgkJCSAJCQkiJSBvZiB0b3RhbCIKCQkJIAkJKQoJCQkgCSkKCQkJIH0KCQkJKQpgYGAKClNvIHdlIGRpZCB0aGUgZGltZW5zaW9uYWwgcmVkdWN0aW9uIGJhc2VkIG9uIHRoZSBiaW9tYXJrIFJOQXMsIHRoZW4gZGlkIG91ciBVTUFQIG5lYXJlc3QgbmVpZ2hib3IgY2x1c3RlcmluZy4KCgpJbiB0aGUgYmlvbWFyayBoaWVyYXJjaGNpYWwgY2x1c3RlcmluZyBhbmFseXNpcyBJIGFzc2F5ZWQgMTY3IGNlbGxzLiBUaGUgc21hbGxlc3QgY2x1c3RlciBJIGRldGVjdGVkIGhhZCAzIGNlbGxzLCBvciAxLjglIG9mIHRvdGFsLCBhbmQgdGhpcyBpcyBhbiB1bmNvbWZvcnRhYmx5IHNtYWxsIG51bWJlciBvZiBjZWxscy4gQmFzZWQgb24gdGhlIFVNQVAgY2FsY3VsYXRpb25zIEkgd291bGQgdGhlcmVmb3JlIGV4cGVjdCB0byBmaW5kIDExIG9yIDEyIG9mIHRoZSBwcmVkaWN0ZWQgMTUgY2x1c3RlcnMuIEkgZm91bmQgMTIsIGFuZCBJIGRvbid0IHJlYWxseSBsaWtlIHRoYXQgbGFzdCBvbmUsIHNvIDExIG9yIDEyLiBTaW5jZSBJIGRpZCB0aGUgaGllcmFyY2hjaWFsIGNsdXN0ZXJpbmcgeWVzdGVyZGF5IGFuZCBkaWQgdGhpcyBtYXRoIHRvZGF5LCB3ZSBjYW4gc2F5IGl0IHdhcyBpbmRlcGVuZGVudCBvZiB0aGVzZSByZXN1bHRzIGFuZCB0aGVyZWZvcmUgdG90YWxseSBsZWdpdC4gWWF5ISEKCg==